在 T-SQL 中强制执行不区分大小写的列引用
Enforcing case insensitive column references in T-SQL
我正在使用 SQL Server 2014。我动态生成了 SQL,看起来像这样(为简洁起见进行了简化):
with CTE as
(
select field as [field], field as [Field]
from myTable
)
select [field], [Field]
from CTE
但是上面的方法导致了这个错误:
The column 'Field' was specified multiple times for 'CTE'.
我会 expect/want 这行得通,因为 2 列实际上是独一无二的,考虑到大小写。无论如何我们可以要求 SQL (也许通过一些 SET 选项)将它们视为唯一的?
我动态生成的 SQL 非常复杂,很难识别这样的 'duplicates' 和 'combine'。
从理论上讲,您可以将数据库的排序规则更改为区分大小写的选项。区分大小写 database/server 排序规则也会考虑别名的大小写敏感度。 Table 列排序规则,而排序 select 中的列则不会。
Changing database/server collation will change a whole lot else though。修复别名问题将是一个非常极端的改变,我怀疑这对您来说是否是一个可行的解决方案。
就是说,如果您的动态 SQL 能够看到别名 field
已经存在并为同一列的下一个实例使用大写别名 Field
,我会认为您可以简单地将其调整为 field1
、field2
等。您始终可以在 outer/final select 中将它们重新命名为任何您想要的别名,他们只需要在 CTE 查询中是唯一的。
我正在使用 SQL Server 2014。我动态生成了 SQL,看起来像这样(为简洁起见进行了简化):
with CTE as
(
select field as [field], field as [Field]
from myTable
)
select [field], [Field]
from CTE
但是上面的方法导致了这个错误:
The column 'Field' was specified multiple times for 'CTE'.
我会 expect/want 这行得通,因为 2 列实际上是独一无二的,考虑到大小写。无论如何我们可以要求 SQL (也许通过一些 SET 选项)将它们视为唯一的?
我动态生成的 SQL 非常复杂,很难识别这样的 'duplicates' 和 'combine'。
从理论上讲,您可以将数据库的排序规则更改为区分大小写的选项。区分大小写 database/server 排序规则也会考虑别名的大小写敏感度。 Table 列排序规则,而排序 select 中的列则不会。
Changing database/server collation will change a whole lot else though。修复别名问题将是一个非常极端的改变,我怀疑这对您来说是否是一个可行的解决方案。
就是说,如果您的动态 SQL 能够看到别名 field
已经存在并为同一列的下一个实例使用大写别名 Field
,我会认为您可以简单地将其调整为 field1
、field2
等。您始终可以在 outer/final select 中将它们重新命名为任何您想要的别名,他们只需要在 CTE 查询中是唯一的。