使用 CS_AS 排序规则在 SQL Server 中查询扩展属性不会提供正确的结果

问题描述 投票:0回答:2

我有两个数据库,一个是

Latin1_General_CI_AI
的排序规则,另一个是
Latin1_General_CS_AS
.

两个数据库都有一个名为

Version
的扩展属性,并且都设置为1.

如果我运行以下代码:

IF ((SELECT value FROM sys.extended_properties WHERE name = 'Version') <> '1')
BEGIN
    RAISERROR ('Wrong Version', 16, 1);
END

我在使用

CS_AS
排序规则的数据库上收到错误“版本错误”,但在使用
CI_AI
排序规则的数据库上却没有。我

我希望两者都不会出错。

让它变得更奇怪,如果我跑:

SELECT value 
FROM sys.extended_properties 
WHERE name = 'Version'

我在两个数据库上都得到了 1 的值。所以我不确定为什么会返回错误。

我也试过跑步

collate
也没有帮助

   IF ((SELECT value FROM sys.extended_properties WHERE name = 'Version' collate Latin1_General_CI_AI) <> 1)
    BEGIN
            RAISERROR ('Wrong Version',16,1);
    END
sql-server tsql collation
2个回答
0
投票

可以使用cast value to varchar,使用collate来解决问题



use [TestDB1]
   IF ((SELECT cast( value  as varchar(100)) collate Latin1_General_CS_AS FROM sys.extended_properties WHERE name = 'Version' ) <> '1')
    BEGIN
            RAISERROR ('Wrong Version',16,1);
    END


use [TestDB2]
   IF ((SELECT cast( value  as varchar(100)) collate Latin1_General_CS_AS FROM sys.extended_properties WHERE name = 'Version' ) <> '1')
    BEGIN
            RAISERROR ('Wrong Version',16,1);
    END


您可以使用以下语句创建数据库并添加扩展属性:

CREATE DATABASE [TestDB1]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'TestDB1', FILENAME = N'C:\1\TestDB1.mdf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'TestDB1_log', FILENAME = N'C:\1\TestDB1_log.ldf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
 COLLATE Latin1_General_CI_AI 

 USE [master]
GO
EXEC [TestDB1].sys.sp_addextendedproperty @name=N'Version', @value=N'1' 
GO

 CREATE DATABASE [TestDB2]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'TestDB2', FILENAME = N'C:\1\TestDB2.mdf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'TestDB2_log', FILENAME = N'C:\1\TestDB2_log.ldf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
 COLLATE Latin1_General_CS_AS 


  USE [master]
GO
EXEC [TestDB2].sys.sp_addextendedproperty @name=N'Version', @value=N'1' 
GO


0
投票

当你做

(SELECT value FROM sys.extended_properties WHERE name = 'Version') <> '1'

'1'
隐式转换为
sql_variant
。这只会比较相等如果字符串的排序实际上相等.

当 char、varchar、nchar 或 nvarchar 数据的 sql_variant 值时 比较类型时,首先根据 以下条件:LCID、LCID 版本、比较标志和排序 ID。 这些标准中的每一个都作为整数值进行比较,并且在 列出的顺序。如果所有这些标准都相同,那么实际 字符串值根据排序规则进行比较。

你可以做到

(SELECT CAST(value AS varchar(10)) FROM sys.extended_properties WHERE name = 'Version') <> '1'

首先将值转换为字符串,然后得到通常的字符串比较语义

© www.soinside.com 2019 - 2024. All rights reserved.