Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 确定varchar是否具有排序规则为Latin1\u CP\u CI\u AS的上下字符_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 确定varchar是否具有排序规则为Latin1\u CP\u CI\u AS的上下字符

Sql server 确定varchar是否具有排序规则为Latin1\u CP\u CI\u AS的上下字符,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正试图找到一个解决这个问题的办法,并在网上浏览了一下。首先,我找到了一个解决方案,但它似乎不是在所有情况下都有效。我不明白为什么 这是我的问题,我使用的排序规则不区分大小写,我无法将我列的排序规则更改为在此列上使用区分大小写的排序规则 这是一个样本和我的测试: declare @passcap varchar(30)= 'Chanel04O!' collate Latin1_General_CI_AS select case when binary_checksum(lower(@passc

我正试图找到一个解决这个问题的办法,并在网上浏览了一下。首先,我找到了一个解决方案,但它似乎不是在所有情况下都有效。我不明白为什么

这是我的问题,我使用的排序规则不区分大小写,我无法将我列的排序规则更改为在此列上使用区分大小写的排序规则

这是一个样本和我的测试:

declare @passcap varchar(30)= 'Chanel04O!' collate Latin1_General_CI_AS

select case when binary_checksum(lower(@passcap)) <> binary_checksum(@passcap) and binary_checksum(UPPER(@passcap)) <> binary_checksum(@passcap) then 1 else 0 end as pass_cap
, binary_checksum(lower(@passcap)), binary_checksum(@passcap)
declare@passcap varchar(30)='Chanel04O!'核对拉丁语1_General_CI_AS
当二进制校验和(下(@passcap))二进制校验和(@passcap)和二进制校验和(上(@passcap))二进制校验和(@passcap)时,选择case,然后选择1,否则0结束为pass\u cap
,二进制校验和(低位(@passcap)),二进制校验和(@passcap)
结果应该是1,因为C和O是大写的。但是我收到一张0

因此,我尝试执行二进制_校验和,我收到了相同的低或正常值:2017408143

但是为什么呢?我发现了问题所在,我有数字和额外字符(!)

我可以想象一个正则表达式只取字符,然后与二进制校验和进行比较,但是还有更合适的吗


感谢您的帮助

只需将字符串的
上限
下限
值与原始字符串进行比较,将
Latin1_General_CS_指定为
排序规则,以便进行比较:

SELECT  CASE
          WHEN @passcap = UPPER(@passcap) COLLATE Latin1_General_CS_AS THEN 0
          WHEN @passcap = LOWER(@passcap) COLLATE Latin1_General_CS_AS THEN 0
          ELSE 1
        END
因此,如果字符串的
上部
下部
版本匹配,将返回0,否则如果两者都不匹配,则将返回1


请注意,区分大小写的排序规则仅用于比较字符串,因此无需修改表。

刚刚使用sql server 2014进行了测试,它可以正常工作。这很奇怪,因为我在发布之前测试的是declare@passcap varchar(30)=“Chanel04O!”核对拉丁语1_General_CS_AS,它不起作用。