【问题标题】:Find reserved keywords in TSQL在 SQL 中查找保留关键字
【发布时间】:2011-06-16 06:29:54
【问题描述】:

我不确定 sql server 2008 中是否有任何内置函数可以判断它是否是保留关键字。

我想这样做的原因是因为我发现有时列名使用与保留关键字相同的名称,例如,名为“desc”、“user”、“state”等的列,然后我们必须用方括号([desc]、[user]、[state])将它们括起来才能正确查询列。

如果确实存在这样的内置函数,那么我们可能可以做到

if isReservedKeyword (@name) = true
  set @column = REPLACE(@column, @name, '[' + @name+ ']')
else
  set @column = @name

【问题讨论】:

    标签: sql tsql sql-server-2008 stored-procedures keyword


    【解决方案1】:

    此处记录了保留字:
    http://msdn.microsoft.com/en-us/library/ms189822.aspx

    这个列表很详尽,但它不是太长,以至于您不能只是将它们重新输入到您自己的数据库表中进行检查。

    【讨论】:

      【解决方案2】:

      有一个内置函数可以解决这个问题,还有“不寻常”字符:QUOTENAME

      返回一个 Unicode 字符串 添加分隔符以进行输入 字符串 一个有效的 SQL Server 分隔符 标识符。

      以下示例采用 字符串 abc[]def 并使用 [ 和 ] 字符创建一个有效的 SQL Server 分隔标识符。

      SELECT QUOTENAME('abc[]def')

      这是结果集。

      [abc[]]def]

      (1 row(s) affected)

      注意右括号中的 字符串 abc[]def 加倍表示 转义字符。

      【讨论】:

        【解决方案3】:

        只需在每一列周围加上括号。这样您就可以确保即使保留字也得到处理。

        【讨论】:

        • 这没关系,除非处理本身包含括号的对象名称 - 更通用/安全的解决方案是 QUOTENAME
        • 不要鼓励每次都在每列周围添加额外字符的做法。表名也会有同样的问题。然后你所有的表和列引用都被括在括号中,使代码膨胀,更难阅读和维护。重构/重命名对象以使其不与保留字冲突的最佳选择。如果做不到这一点,您最初的想法是只处理您的 sql 代码以包装所有令人反感的代码,这似乎是一个很好的临时措施。在几乎所有情况下,您都可以通过更明确地避免使用保留字。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        相关资源
        最近更新 更多