SQL Server Variants不等同于

时间:2017-05-10 03:52:06

标签: sql-server tsql

发生了一个奇怪的错误。我有一个函数有2个变量声明为SQL变量,是@ CCY1和@ CCY2。在代码中我简单地说这样的话......

IF @CCY1=@CCY2
BEGIN
    SELECT @fx_rate=1
    RETURN @fx_rate
END

在我的笔记本电脑上,如果@ CCY1等于'AUD'且@ CCY2也等于'AUD',那么BEGIN / END中的代码就会执行。但是在生产环境中,这并不成立,并且@ CCY1<> @ CCY2。

通过在此实例中强制转换为VARCHAR,可以轻松解决此问题。我的问题是为什么两种不同环境(两者都是SQL Server 2016)的行为会有所不同?

1 个答案:

答案 0 :(得分:1)

为了检查sql_vairiant字段中的差异,您可以使用SQL_VARIANT_PROPERTY

您可以检查第一个变量的排序规则是否与第二个排序规则的排序规则不同?

DECLARE @A1 SQL_VARIANT = 'AUD' COLLATE Latin1_General_CS_AI
       ,@A2 SQL_VARIANT = 'AUD' COLLATE Latin1_General_CS_AS;

SELECT SQL_VARIANT_PROPERTY (@A1, 'Collation');  
SELECT SQL_VARIANT_PROPERTY (@A2, 'Collation');

SELECT IIF(@A1 = @A2, 1, 0); -- not true

SET @A1 = CAST(@A1 AS VARCHAR(24));
SET @A2 = CAST(@A2 AS VARCHAR(24));

SELECT SQL_VARIANT_PROPERTY (@A1, 'Collation');  
SELECT SQL_VARIANT_PROPERTY (@A2, 'Collation');

SELECT IIF(@A1 = @A2, 1, 0); -- true

enter image description here

如您所见,当您执行强制转换时,将使用默认数据库归类。如果两个变量的排序规则相同,则可以检查其他一些属性。