如何在列别名中转义方括号?

时间:2019-06-13 07:35:42

标签: sql-server tsql column-alias

以下产生错误:

SELECT 1 AS [dada[daa]]
  

消息105,级别15,状态1,行190   字符串'dada [daa]'。

     

第102层15州立1行190消息   'dada [daa]'附近的语法不正确。

如果列别名中有方括号,则可以使用如下引号:

SELECT 1 AS 'dada[daa]'

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

那么,有什么办法可以逃脱这些括号吗?

2 个答案:

答案 0 :(得分:2)

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

SELECT *
FROM [My]]Table];

尽管您只需要使用右括号来完成此操作,而不必使用左括号。例如:

SELECT *
FROM [My[Table];

基于此语句,但是“但是我正在构建一些复杂的动态T-SQL语句,并且每个列别名都用方括号括起来,如果别名包含方括号,则使用引号会使事情变得更难。” < / em>似乎您正在执行类似'... FROM [' + @TableName + '] ...'的操作;别。使用QUOTENAME'... FROM ' + QUOTENAME(@TableName) + '...'

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

答案 1 :(得分:1)

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

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

真正的问题

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

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

Reporting services也是如此,尽管更现代的解决方案将从其他来源(例如数据库)提取翻译