如何转义列别名中的方括号?
How to escape square brackets in column alias?
以下产生错误:
SELECT 1 AS [dada[daa]]
Msg 105, Level 15, State 1, Line 190 Unclosed quotation mark after the
character string 'dada[daa] '.
Msg 102, Level 15, State 1, Line 190
Incorrect syntax near 'dada[daa] '.
如果我在列别名中有方括号,我可以使用这样的引号:
SELECT 1 AS 'dada[daa]'
但我正在构建一些复杂的动态 T-SQL 语句,每个列别名都用方括号括起来,如果别名包含方括号则使用引号会使事情变得有点困难。
那么,有没有办法以某种方式转义这些括号?
显而易见的答案是避免 名称中的方括号。方括号和双引号在 T-SQL 中用作引号字符(双引号也在 ANSI 标准中)。
除此之外,您还可以对引号字符进行双引号,例如:
select 1 as [da[da]]]
da[da]
------
1
或
select 1 as "da[da]"
da[da]
------
1
最后
select 1 as "da""da"""
da"da"
------
1
同样,您应该不这样做,因为它会导致代码脆弱
真正的问题
从评论来看,实际问题似乎是本地化显示的字段名称。出于某种原因,这是在查询中完成的,如果字段名称包含引号或其他意外字符,这可能会导致各种问题。
常见的解决方案是将结果本地化到 presentation 层,而不是查询。大多数报告工具、Web 和桌面应用程序堆栈都支持这一点。 Windows 表单、WPF 和所有 ASP.NET 堆栈都有自己的本地化功能。
Reporting services也是如此,尽管更现代的解决方案会从数据库等其他来源提取翻译
你需要将它们加倍,就像单引号一样 ('
):
SELECT *
FROM [My]]Table];
尽管如此,您只需要使用右括号来执行此操作,而不必使用左括号。例如:
SELECT *
FROM [My[Table];
然而,根据此声明 "but I am building some complex dynamic T-SQL statements and each column alias is enclosed with square brackets and using quotes if the alias contains brackets will make things a little bit harder.",您似乎在做类似 '... FROM [' + @TableName + '] ...'
的事情;不。使用 QUOTENAME
: '... FROM ' + QUOTENAME(@TableName) + '...'
.
QUOTENAME
正确引用并转义您的变量。因此,对于值 '[MyTable]'
,它将 return '[[MyTable]]]'
。它还有第二个可选参数,可用于用其他标识符引用输入字符串。例如,假设变量 @String
的值为 "Don't",QUOTENAME(@String, '''')
将 return 'Don''t'
。
以下产生错误:
SELECT 1 AS [dada[daa]]
Msg 105, Level 15, State 1, Line 190 Unclosed quotation mark after the character string 'dada[daa] '.
Msg 102, Level 15, State 1, Line 190 Incorrect syntax near 'dada[daa] '.
如果我在列别名中有方括号,我可以使用这样的引号:
SELECT 1 AS 'dada[daa]'
但我正在构建一些复杂的动态 T-SQL 语句,每个列别名都用方括号括起来,如果别名包含方括号则使用引号会使事情变得有点困难。
那么,有没有办法以某种方式转义这些括号?
显而易见的答案是避免 名称中的方括号。方括号和双引号在 T-SQL 中用作引号字符(双引号也在 ANSI 标准中)。
除此之外,您还可以对引号字符进行双引号,例如:
select 1 as [da[da]]]
da[da]
------
1
或
select 1 as "da[da]"
da[da]
------
1
最后
select 1 as "da""da"""
da"da"
------
1
同样,您应该不这样做,因为它会导致代码脆弱
真正的问题
从评论来看,实际问题似乎是本地化显示的字段名称。出于某种原因,这是在查询中完成的,如果字段名称包含引号或其他意外字符,这可能会导致各种问题。
常见的解决方案是将结果本地化到 presentation 层,而不是查询。大多数报告工具、Web 和桌面应用程序堆栈都支持这一点。 Windows 表单、WPF 和所有 ASP.NET 堆栈都有自己的本地化功能。
Reporting services也是如此,尽管更现代的解决方案会从数据库等其他来源提取翻译
你需要将它们加倍,就像单引号一样 ('
):
SELECT *
FROM [My]]Table];
尽管如此,您只需要使用右括号来执行此操作,而不必使用左括号。例如:
SELECT *
FROM [My[Table];
然而,根据此声明 "but I am building some complex dynamic T-SQL statements and each column alias is enclosed with square brackets and using quotes if the alias contains brackets will make things a little bit harder.",您似乎在做类似 '... FROM [' + @TableName + '] ...'
的事情;不。使用 QUOTENAME
: '... FROM ' + QUOTENAME(@TableName) + '...'
.
QUOTENAME
正确引用并转义您的变量。因此,对于值 '[MyTable]'
,它将 return '[[MyTable]]]'
。它还有第二个可选参数,可用于用其他标识符引用输入字符串。例如,假设变量 @String
的值为 "Don't",QUOTENAME(@String, '''')
将 return 'Don''t'
。