我发现文档、博客文章、Stackoverflow的答案对于解释打开的QUOTED_IDENTIFIER
含义没有帮助。
旧时代
最初,SQL Server 允许您在字符串周围交替使用引号( "..."
) 和撇号( '...'
)(就像 Javascript 一样):
SELECT "Hello, world!"
--引号
SELECT 'Hello, world!'
--撇号
如果你想要一个名称表、视图、过程、列等,否则会违反命名对象的所有规则,你可以将它括在方括号( [
, ]
) 中:
CREATE TABLE [The world's most awful table name] (
[Hello, world!] int
)
SELECT [Hello, world!] FROM [The world's most awful table name]
这一切都奏效了,而且是有道理的。
然后是ANSI
然后 ANSI 出现并有了其他想法:
- 对字符串使用撇号( )
'...'
- 如果您有一个时髦的名称,请将其用引号(
"..."
)括起来
- 我们甚至不关心你的方括号
这意味着如果你想“引用”一个时髦的列或表名,你必须使用引号:
SELECT "Hello, world!" FROM "The world's most awful table name"
如果您了解 SQL Server,您就会知道引号已经被用于表示字符串。如果您盲目地尝试像执行T- SQL一样执行该ANSI- SQL ,那是无稽之谈:
SELECT 'Hello, world!' FROM 'The world''s most awful table name'
SQL Server 会告诉你:
Msg 102, Level 15, State 1, Line 8
Incorrect syntax near 'The world's most awful table name'.
您必须选择加入新的 ANSI 行为
因此,Microsoft 添加了一项功能,让您可以选择加入 ANSI 风格的 SQL。
原始 (又名 SET QUOTED_IDENTIFIER OFF)
SELECT "Hello, world!" --valid
SELECT 'Hello, world!' --valid
设置 QUOTED_IDENTIFIER ON
SELECT "Hello, world!" --INVALID
SELECT 'Hello, world!' --valid
现在每个人都有SET QUOTED_IDENTIFIERS ON
,这在技术上意味着你应该使用quotes
而不是square brackets
围绕标识符:
T-SQL(不好?) (例如由实体框架生成的 SQL)
UPDATE [dbo].[Customers]
SET [FirstName] = N'Ian'
WHERE [CustomerID] = 7
ANSI-SQL(好?)
UPDATE "dbo"."Customers"
SET "FirstName" = N'Ian'
WHERE "CustomerID" = 7
实际上,SQL Server 世界中没有人使用 U+0022 QUOTATION MARK"来包装标识符。我们都继续使用[]。