我有两个数据库,一个是
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
可以使用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
当你做
(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'
首先将值转换为字符串,然后得到通常的字符串比较语义