Tag: sql server

我如何创build一个也允许空值的唯一约束?

我想对我将要用GUID填充的列有一个唯一的约束。 但是,我的数据包含这些列的空值。 如何创build允许多个空值的约束? 这是一个示例场景 。 考虑这个模式: CREATE TABLE People ( Id INT CONSTRAINT PK_MyTable PRIMARY KEY IDENTITY, Name NVARCHAR(250) NOT NULL, LibraryCardId UNIQUEIDENTIFIER NULL, CONSTRAINT UQ_People_LibraryCardId UNIQUE (LibraryCardId) ) 然后看看我想要实现的代码: — This works fine: INSERT INTO People (Name, LibraryCardId) VALUES ('John Doe', 'AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA'); — This also works fine, obviously: INSERT INTO People (Name, LibraryCardId) VALUES […]

表中主键的最佳做法是什么?

在devise表格的时候,我养成了一个习惯,那就是有一列是唯一的,而且是主键。 这取决于要求以三种方式实现: 自动递增的标识整数列。 唯一标识符(GUID) 可用作行标识符列的短字符(x)或整数(或其他相对较小的数字types)列 数字3将用于相当小的查找,大多数读取的表格可能具有唯一的静态长度string代码,或数字值(例如年份或其他数字)。 大多数情况下,所有其他表将具有自动递增整数或唯一标识符主键。 问题:-) 我最近开始使用没有一致的行标识符的数据库,主键当前在不同的列上聚集在一起。 一些例子: date时间/字符 date时间/整数 date时间/ VARCHAR 炭/ NVARCHAR / nvarchar的 这有没有一个有效的案例? 我会一直为这些情况定义一个身份或唯一标识符列。 另外还有很多没有主键的表格。 如果有的话,有什么理由呢? 我试图理解为什么桌子是按照原样devise的,这对我来说似乎是一个很大的混乱,但也许有充分的理由。 第三个问题可以帮助我解释答案:在使用多列来组成复合主键的情况下,这种方法与代理/人工键有什么特别的优势? 我主要在考虑性能,维护,pipe理等方面?

T-SQL有一个聚合函数来连接string吗?

可能重复: SQL Server 2000中的Implodetypes函数? 连接行值T-SQL 我有一个观点,我正在查询,看起来像这样: BuildingName PollNumber ———— ———- Foo Centre 12 Foo Centre 13 Foo Centre 14 Bar Hall 15 Bar Hall 16 Baz School 17 我需要编写一个将BuildingNames分组在一起的查询,并显示如下的PollNumbers列表: BuildingName PollNumbers ———— ———– Foo Centre 12, 13, 14 Bar Hall 15, 16 Baz School 17 我怎样才能在T-SQL中做到这一点? 我宁愿不为这个写一个存储过程,因为它看起来像是过度杀伤,但我不完全是一个数据库的人。 看起来像SUM()或AVG()这样的聚合函数就是我所需要的,但是我不知道T-SQL是否有。 我正在使用SQL Server 2005。

填充前导零的string,所以它在SQL Server 2008中的长度是3个字符

在SQL Server 2008 R2中首次创build时,我有一个长达3个字符的string。 我想填充前导零,所以如果它的原始值是'1',那么新的值就是'001'。 或者如果其原始值是“23”,则新值是“023”。 或者如果它的原始值是'124',那么新值与原始值相同。 我正在使用SQL Server 2008 R2。 我将如何使用T-SQL来做到这一点?

如何插入多行而不重复声明的“INSERT INTO dbo.Blah”部分?

我知道我在几年前就已经这样做了,但是我不记得语法,因为大量的关于“批量import”的帮助文档和文章,我找不到任何地方。 这是我想要做的,但语法不完全正确…请,谁做了这个之前,帮助我:) INSERT INTO dbo.MyTable (ID, Name) VALUES (123, 'Timmy'), (124, 'Jonny'), (125, 'Sally') 我知道这是接近正确的语法。 我可能在那里需要“BULK”这个词,或者什么,我不记得了。 任何想法? 我需要这个SQL Server 2005数据库。 我试过这个代码,无济于事: DECLARE @blah TABLE ( ID INT NOT NULL PRIMARY KEY, Name VARCHAR(100) NOT NULL ) INSERT INTO @blah (ID, Name) VALUES (123, 'Timmy') VALUES (124, 'Jonny') VALUES (125, 'Sally') SELECT * FROM @blah 我Incorrect […]

什么是系统表master..spt_values的目的是什么,它的值的含义是什么?

系统表master的目的是什么?spt_values? 为什么提供了,怎么用呢? 它的types是什么意思,低,高价值? 更新: 谷歌search给了成千上万的“它的用途”,例如: 使用master..spt_values分隔列 它包含从0到2047的数字。这是非常有用的。例如,如果您需要从这个范围内填充100个数字 为build立索引 创build虚拟日历 以一些非直观和复杂的方式获得对象的描述 枚举SQL Server数据库中的所有索引(Giuseppe Dimauro,devx.com) “显示磁盘空间使用情况的SQL Server 2005脚本” “这不值得谈论,这张桌子是一个”超级“查询表的devise噩梦” 一些post警告不要使用它,因为它可以在未来版本的SQL Server中删除,但是已经有代码脚本用它来说明新的SQL Server 11(Denali)的新function: 使用OFFSET N ROWS FETCH NEXT N ROWS ONLY在SQL Server Denali中进行简单的分页

SQLParameter如何防止SQL注入?

到底什么是在后台,使SQLParameter可以防止在.NET参数化查询中的SQL Inection攻击? 它只是剥离任何可疑的字符或有什么更多的呢? 有没有人在那里检查,当你通过恶意input实际到达SQL Server? 相关: 你可以在SQL FROM语句中使用SQLParameter吗?

SQL Server进程队列争用条件

我有一个通过存储过程由多个订单处理器访问的订单队列。 每个处理器传入一个唯一的ID,用于locking下一个20个订单,供自己使用。 存储过程然后将这些logging返回到订单处理器以执行操作。 在某些情况下, 多个处理器可以检索同一个“OrderTable”logging ,并在这个logging上尝试同时对其进行操作。 这最终导致过程中稍后抛出错误。 我的下一步行动是让每个处理器抓取所有可用的命令,并循环处理器,但是我希望简单地使这部分代码线程安全,并允许处理器随时抓取logging。 所以明确 – 任何想法,为什么我遇到这种竞争条件,以及如何解决问题。 BEGIN TRAN UPDATE OrderTable WITH ( ROWLOCK ) SET ProcessorID = @PROCID WHERE OrderID IN ( SELECT TOP ( 20 ) OrderID FROM OrderTable WITH ( ROWLOCK ) WHERE ProcessorID = 0) COMMIT TRAN SELECT OrderID, ProcessorID, etc… FROM OrderTable WHERE ProcessorID = @PROCID

sql server的CTE和recursion的例子

我从不使用recursion的CTE。 我刚刚读了一篇文章。 本文通过Sql服务器CTE和recursion显示员工信息。 这基本上是显示员工和他们的经理信息。 我无法理解这个查询是如何工作的。 这是查询: WITH cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel) AS ( SELECT EmployeeID, FirstName, LastName, ManagerID, 1 FROM Employees WHERE ManagerID IS NULL UNION ALL SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID, r.EmpLevel + 1 FROM Employees e INNER JOIN cteReports r ON e.ManagerID = r.EmpID ) SELECT FirstName + ' ' + […]

如何检查SQL Server表中是否存在列

如果它不存在,我需要添加一个特定的列。 我有这样的事情,但总是返回false: IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTableName' AND COLUMN_NAME = 'myColumnName') 如何检查SQL Server数据库表中是否存在列?