3

具体来说,Sql Server 2005/T-Sql。我有一个主要是一系列两个字符的字段,它们都应该是大写的,但是有一些旧数据早于当前的数据库/系统,我需要找出哪些记录违反了大写外壳契约。

我认为这会起作用:

select * from tbl where ascii(field1) <> ascii(upper(field1))

事实上,它还给了我一些记录。此后它们已被更正,现在该查询不返回任何数据。但是我有人告诉我数据库中仍然存在混合大小写数据,我刚刚找到了一个示例:“FS”和“Fs”都报告了相同的 ascii 值。

为什么这种方法有缺陷?有什么更好的方法来解决这个问题,或者我怎样才能修复这种方法以使其正常工作?

4

7 回答 7

5

如果所有日期都应该是大写的,那就做一个更新

update tbl
set field1 = upper(field1)

但要回答您的原始问题,此查询应该会给您预期的结果:

select * from tbl
where field1 COLLATE Latin1_General_CS_AS <> upper(field1)

编辑:刚刚注意到使用 COLLATE 的建议也是由Ian发布的

于 2009-02-04T13:41:27.380 回答
3

ASCII 只比较第一个字母。您必须比较每个字母,或将数据库排序规则更改为区分大小写。

您可以在整个数据库级别更改排序规则,或者仅在特定查询的一列上更改排序规则,因此:

SELECT myColumn 
  FROM myTable  
  WHERE myColumn COLLATE Latin1_General_CS_AS <> upper(myColumn)
于 2009-02-04T13:41:50.950 回答
2

如果您将多个字符串传递给 ascii() 函数,则它只会返回表达式中第一个字符的 ascii 编号。要进行您想要的比较,您需要查看单个字符,而不是整个字段。

于 2009-02-04T13:40:05.290 回答
1

ASCII() 函数只返回字符表达式最左边字符的 ASCII 码值。请改用 UPPER()。

于 2009-02-04T13:40:32.920 回答
1

这可能有效:

select * from tbl 
where cast(field1 as varbinary(256)) <> cast(upper(field1) as varbinary(256))
于 2009-02-04T13:42:04.430 回答
1

SQL Server 查询中区分大小写的搜索中描述的方法可能对您有用。

于 2009-02-04T13:47:28.007 回答
0

根据文档ASCII(),它只返回最左边的字符。

我认为你做错了。你可以简单地:

select * from tbl where field1 <> upper(field1)

如果排序规则设置正确,那么为什么不修复排序规则呢?如果您无法永久更改它们,请尝试:

select * from tbl where
          (field1 collate Latin1_General_CS_AS)
  <> upper(field1 collate Latin1_General_CS_AS)
于 2009-02-04T13:49:17.410 回答