使用双引号定义字段别名是最佳解决方案吗?

时间:2013-09-03 14:05:51

标签: sql-server delphi sql-server-2008-r2

我在运行时创建一个查询(使用我的Delphi应用程序)然后我用

执行
EXEC (MyRunTimeGeneratedQuery)

一个例子是:

SELECT
1977 AS [[Employee] Year Of Birth],
'Marc' AS [[Employee] Name]

一个DB字段包含“[Employee]出生日期”,因此在生成的查询中我有一个双“]”,这会产生语法错误。在“Employee”之后的“]”之后的SQL Server是expectring“,”。

我发现解决方案是使用双引号括起所有字段别名:

SELECT
1977 AS "[Employee] Year Of Birth",
'Marc' AS "[Employee] Name"

这是一个可靠的解决方案吗?如果有的话有哪些缺点? (这是我的问题!)

我能想到的另一个解决方案是不允许用户存储“]”,以便

“[员工]出生日期”

可能会成为

“(员工)出生日期”

1 个答案:

答案 0 :(得分:4)

如果别名中可能有",则使用"作为字段别名的封闭字符可能会导致同样的问题,例如:别名"Employee" Year Of Birth,我想将导致查询形成为:

SELECT
    1977 AS ""Employee" Year Of Birth",
-- etc.

这在语法上是错误的。

我认为正确的做法是引用别名。如果使用"作为别名封闭字符,则在编写查询时,应将原始别名中的每个"加倍。如果您使用[],则应将原始别名中的每个]加倍。

函数quotename将为您执行相同操作(以及包含[]的别名),但您不能将其用作:

SELECT
    1977 AS quotename('[Employee] Year Of Birth'),
-- etc.

如果您希望使用quotename,则应在撰写查询之前完成(除非quotename本身是查询的一部分)。