【问题标题】:How to escape square brackets in column alias? [duplicate]如何转义列别名中的方括号? [复制]
【发布时间】:2019-10-27 18:06:05
【问题描述】:

以下产生错误:

SELECT 1 AS [dada[daa]]

Msg 105, Level 15, State 1, Line 190 字符串'dada[daa]'。

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

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

SELECT 1 AS 'dada[daa]'

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

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

【问题讨论】:

    标签: sql-server tsql column-alias


    【解决方案1】:

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

    SELECT *
    FROM [My]]Table];
    

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

    SELECT *
    FROM [My[Table];
    

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

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

    【讨论】:

    • 谢谢你——把最后一个加倍就足够了——它只用于列别名,没有数据源,所以一切都很好。
    • 如果可以的话,我建议QUOTENAME@gotqn。它在创建动态 SQL 时非常宝贵。
    【解决方案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
    

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

    真正的问题

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

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

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

    【讨论】:

    • 在完美的世界中 - 它会很好 :-) 我处于允许客户对每个列别名使用全球化以便在他们的报告中获取自定义文本并且没有设置限制的情况全球化界面 ...
    • @gotqn 只要在查询中设置了字段别名,无论数据库如何,引号都会成为问题。一个更好(和更常见)的解决方案是本地化UI 上的字段名称,例如网页、表单或报告工具。大多数网络堆栈和报告工具都支持这一点。
    • @gotqn 如果您需要在查询中本地化别名,则必须检查别名以查看其中包含的引用并使用“其他”引用。例如,在 MySQL 中,您可以检查 ` 或 " 并将别名包装在另一个引号中。在 SQL Server 中,它是 []"。PostgreSQL 有美元引号字符串。如果别名包含 both 引号 .... 不要让他们输入两个引号。
    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 2019-08-16
    • 2017-01-26
    • 1970-01-01
    • 2013-08-16
    • 2011-08-17
    • 1970-01-01
    • 2017-07-20
    相关资源
    最近更新 更多