Sql 区别于;AB";及;Ab";在字符数据库字段中
特别是Sql Server 2005/T-Sql。我有一个主要由两个字符组成的字段,它们都应该是大写的,但有一些旧数据早于当前的DB/系统,我需要找出哪些记录违反了大写约定 我认为这会奏效:Sql 区别于;AB";及;Ab";在字符数据库字段中,sql,sql-server,database,ascii,Sql,Sql Server,Database,Ascii,特别是Sql Server 2005/T-Sql。我有一个主要由两个字符组成的字段,它们都应该是大写的,但有一些旧数据早于当前的DB/系统,我需要找出哪些记录违反了大写约定 我认为这会奏效: select * from tbl where ascii(field1) <> ascii(upper(field1)) 从tbl中选择*其中ascii(字段1)ascii(上限(字段1)) 事实上,它还给了我一些记录。它们已被更正,现在该查询不返回任何数据。但有人告诉我,数据库中仍然存在
select * from tbl where ascii(field1) <> ascii(upper(field1))
从tbl中选择*其中ascii(字段1)ascii(上限(字段1))
事实上,它还给了我一些记录。它们已被更正,现在该查询不返回任何数据。但有人告诉我,数据库中仍然存在混合大小写数据,我刚刚发现了一个例子:“FS”和“FS”都报告相同的ascii值
为什么这种方法有缺陷?有什么更好的方法可以实现这一点,或者如何修复此方法以正确工作?如果传递多个字符串,ascii()函数将仅返回表达式中第一个字符的ascii数。要进行所需的比较,需要查看单个字符,而不是整个字段 函数的作用是:只返回字符表达式最左边字符的ASCII码值。改为使用大写()。如果所有日期都应该是大写的,只需进行更新即可
update tbl
set field1 = upper(field1)
但要回答您的原始问题,此查询应提供您期望的结果:
select * from tbl
where field1 COLLATE Latin1_General_CS_AS <> upper(field1)
从tbl中选择*
其中字段1将拉丁语1\u General\u CS\u与upper(字段1)进行对比
编辑:刚刚注意到使用COLLATE的建议也是由发布的,ASCII只是比较了第一个字母。您必须比较每个字母,或者将数据库排序规则更改为区分大小写 您可以更改整个数据库级别的排序规则,也可以更改特定查询的一列排序规则,以便:
SELECT myColumn
FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS <> upper(myColumn)
选择myColumn
从myTable
其中myColumn将Latin1\u General\u CS\u比较为upper(myColumn)
这可能有效:
select * from tbl
where cast(field1 as varbinary(256)) <> cast(upper(field1) as varbinary(256))
从tbl中选择*
其中强制转换(字段1为varbinary(256))强制转换(上部(字段1)为varbinary(256))
中描述的方法可能对您有用。根据,它只返回最左边的字符
我认为你做得不对。
你可以简单地:
select * from tbl where field1 <> upper(field1)
从tbl中选择*,其中字段1位于上方(字段1)
如果排序规则设置正确?如果无法永久更改,请尝试:
select * from tbl where
(field1 collate Latin1_General_CS_AS)
<> upper(field1 collate Latin1_General_CS_AS)
从tbl中选择*,其中
(字段1核对拉丁语1\u一般\u CS\u AS)
上部(字段1对比拉丁语1\u一般\u CS\u AS)
np,但我认为@tehvan有一个优点,那就是你可以完全省略ASCII的使用。我需要找到错误的特定记录,以便我可以报告哪些记录被更改。你也可以在查询中使用COLLATE Latin1_General_CS_AS,强制该查询中的一列区分大小写。我同意,这是一个更好的方法,我没有考虑。谢谢你的帽子提示……