0

以下产生错误:

SELECT 1 AS [dada[daa]]

消息 105,级别 15,状态 1,第 190 行字符串 'dada[daa]' 后面的未闭合引号。

消息 102,级别 15,状态 1,第 190 行“dada[daa]”附近的语法不正确。

如果我在列别名中有方括号,我可以使用这样的引号:

SELECT 1 AS 'dada[daa]'

但是我正在构建一些复杂的动态 T-SQL 语句,并且每个列别名都用方括号括起来,如果别名包含括号,则使用引号会使事情变得有点困难。

那么,有没有办法以某种方式逃避这些括号?

4

2 回答 2

3

您需要将它们加倍,就像单引号 ( ') 一样:

SELECT *
FROM [My]]Table];

不过,您只需要使用右括号来执行此操作,而无需使用左括号。例如:

SELECT *
FROM [My[Table];

然而,基于此声明“但我正在构建一些复杂的动态 T-SQL 语句,并且每个列别名都用方括号括起来,如果别名包含括号,则使用引号会使事情变得更难一些。” 好像您正在做类似的事情'... FROM [' + @TableName + '] ...';不。使用QUOTENAME'... FROM ' + QUOTENAME(@TableName) + '...'

QUOTENAME正确引用和转义您的变量。因此,对于 value '[MyTable]',它将返回'[[MyTable]]]'。它还有第二个可选参数,可用于引用带有其他标识符的输入字符串。例如,假设变量@String的值为“Don't”,则QUOTENAME(@String, '''')返回'Don''t'.

于 2019-06-13T07:41:37.630 回答
2

显而易见的答案是避免名称中的方括号。括号和双引号在 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

同样,您可能应该这样做,因为它会导致代码脆弱

真正的问题

从评论看来,实际问题似乎是本地化显示的字段名称。出于某种原因,这是在查询中完成的,如果字段名称包含引号或其他意外字符,可能会导致各种问题。

对此的常见解决方案是将结果本地化在表示层上,而不是在查询上。大多数报告工具、Web 和桌面应用程序堆栈都支持这一点。Windows 窗体、WPF 和所有 ASP.NET 堆栈都有自己的本地化功能。

报告服务也是如此,尽管更现代的解决方案会从数据库等其他来源提取翻译

于 2019-06-13T07:41:28.777 回答