我发现下面的查询在运行相同兼容性级别、相同设置选项等的两个 Azure 超大规模数据库上返回不同的结果。
IF CAST(ServerProperty('Edition') AS nvarchar(128)) = 'SQL Azure' BEGIN
SELECT 1
END
IF ServerProperty('Edition') = 'SQL Azure' BEGIN
SELECT 2
END
IF 'SQL Azure' = ServerProperty('Edition') BEGIN
SELECT 3
END
在一个数据库上,它只返回 1,在另一个数据库上它返回 1,2 和 3。
我调查了根本原因,它似乎是由数据库的不同排序规则引起的。
对于以下查询:
SELECT SQL_VARIANT_PROPERTY(ServerProperty('Edition'), 'Collation')
SELECT name, collation_name, compatibility_level FROM sys.databases
只返回一行的数据库,结果是:
-----------------------------
SQL_Latin1_General_CP1_CI_AS
name collation_name compatibility_level
------------ -------------------------------- -------------------
master SQL_Latin1_General_CP1_CI_AS 140
my_database SQL_Latin1_General_CP850_CI_AS 150
数据库返回 1,2,3 的结果是:
-----------------------------
SQL_Latin1_General_CP1_CI_AS
name collation_name compatibility_level
------------ -------------------------------- -------------------
master SQL_Latin1_General_CP1_CI_AS 140
my_database SQL_Latin1_General_CP1_CI_AS 150
因此,没有强制转换的简单比较是sql_variant
与varchar
(当我使用时没有区别N'SQL Azure'
)比较,其中底层nvarchar
的sql_variant
排序规则在一种情况下与我查询的数据库不同,在另一种情况下它是匹配的。
首先,我假设比较具有不同排序规则的两个字符串会失败,就像当您尝试加入具有不同排序规则的两列时它会失败一样,但这里显然不是这种情况。
无论如何,安全比较可能sql_variant
与 a的函数的输出的最佳方法是varchar
什么?