查询表格和列为关键字的列

时间:2010-01-25 20:44:10

标签: sql sql-server keyword

假设SQL Server 2005 +。

A部分:

对于任何用户 或<从系统/内部/元/任何表/视图(对不起,不是数据库忍者)查询的规范方法是什么? strong>列使用SQL Server关键字的名称(如case)?

我不介意维护关键字列表,如果它不可查询,因为它只会随着支持的SQL Server版本而改变(对吗?)。

查看SQL Server 2005中的可用视图,我可以轻松地从INFORMATION_SCHEMA.COLUMNSINFORMATION_SCHEMA.TABLES查询此信息,但我希望确保它来自最佳位置以便将来验证。< / p>

B部分:

是否可以通过查询获取关键字列表?

更新虽然这是一个有用的概念,但我特别对转义有问题的列/表/等名称感兴趣,因为我希望编写一个工具这将检查与关键字共享名称的表/列/ etc,并向开发人员提供有用的警告。该工具将在我办公室的代码审查期间使用,以指出开发人员可能想要考虑重命名该实体。 (或者希望开发人员代码审查之前为自己的利益做好准备!)我甚至可以将其设置为在我的构建脚本中使用持续集成,但这只是对未来的考虑。

3 个答案:

答案 0 :(得分:2)

您应正确引用所使用的名称。如果生成代码,请使用内置的QUOTENAME函数。不要构建已知关键字的列表,而是引用每个对象使用的每个名称,包括数据库名称,模式名称和对象名称。还要确保始终遵守所涉及对象的正确情况。作为最佳实践,请在区分大小写的排序规则服务器实例上进行开发。在区分大小写的服务器排序规则(默认)上开发代码可能会导致在区分大小写的排序规则服务器上部署时生成失败。

对于A部分

我个人会选择sys.columns和sys.objects。 INFORMATION_SCHEMA视图也很好,理论上它们是“可移植的”,但我更习惯于SQL特定的视图。我选择sys.objects与sys.tables,因为它涵盖了更多(例如视图)。我建议你也包括表值函数,表值参数类型(仅限2008年)和临时#tables和表@variables在存储过程中声明。这样只会遗漏客户发送的临时#tables和表@variables,但这些只是客户端代码。

答案 1 :(得分:1)

答:只需在标识符周围使用括号。

select [procedure].[case] from [procedure]

B:我不确定你是否可以查询它们,但有关于它的MSDN page

如果您需要以编程方式进行这些操作,我建议您将它们全部插入到表格中供您自己使用。

答案 2 :(得分:0)

为什么需要知道关键字列表? a:它们不会经常更改,而b:对于任何常规代码(我不包括“sql server management studio”之类的内容),您只需使用方括号:

SELECT [table].[column], [table].[join]
FROM [table]