我有一个包含多个表格的数据库,我需要在数据库中搜索每个 varchar
列,以查找同时包含大写和小写字符的列。
澄清:
如果一列包含helLo
,则查询应返回列名称,但如果列值仅包含hello
或HELLO
然后不返回列的名称。
答案 0 :(得分:7)
让我们排除所有UPPER和所有LOWER,其余的将被混合。
SELECT someColumn
FROM someTable
WHERE someColumn <> UPPER(someColumn) AND someColumn <> LOWER(someColumn)
修改强>:
根据建议in comments并详细说明here我需要指定区分大小写的排序规则。
SELECT someColumn
FROM someTable
WHERE someColumn <> UPPER(someColumn) AND
someColumn <> LOWER(someColumn)
Collate SQL_Latin1_General_CP1_CS_AS
答案 1 :(得分:3)
听起来好像是在进行区分大小写的搜索之后,因此您需要对WHERE子句使用区分大小写的排序规则。
e.g。如果您的排序规则当前是SQL_Latin1_General_CP1_CI_AS(不区分大小写),则可以使用以下命令编写区分大小写的查询:
SELECT SomeColumn
FROM dbo.SomeTable
WHERE SomeField LIKE '%helLo%' COLLATE SQL_Latin1_General_CP1_CS_AS
此处,COLLATE SQL_Latin1_General_CP1_CS_AS
告诉它使用区分大小写的排序规则来执行过滤。
答案 2 :(得分:0)
您可以检查哈希值与其上限值和下限值的比较...这是一个简单的测试:
impl T for A, B {
fn double(&self) -> u32 {
/* ... */
}
}
所以在表中使用它......你可以做这样的事情
declare @test varchar(256)
set @test = 'MIX' -- Try changing this to a mix case, and then all lower case
select case
when hashbytes('SHA1',@test) <> hashbytes('SHA1',upper(@test)) and hashbytes('SHA1',@test) <> hashbytes('SHA1',lower(@test))
then 'MixedCase'
else 'Not Mixed Case'
end
答案 3 :(得分:0)
我想我明白你想找到任何包含混合案例数据的varchar列吗?
如果是这样,您可以使用cursor
查看列类型来实现此目的,然后在它找到的varchar
列上执行一些动态SQL,以检查数据是否为混合大小写值。
我完全建议您使用数据库副本在非生产服务器上执行此操作,这不仅仅是因为您需要创建一个表格以将结果存入:
create table VarcharColumns (TableName nvarchar(max), ColumnName nvarchar(max))
declare @sql nvarchar(max)
declare my_cursor cursor local static read_only forward_only
for
select 'insert into VarcharColumns select t,c from(select ''' + s.name + '.' + tb.name + ''' t, ''' + c.name + ''' c from ' + s.name + '.' + tb.name + ' where ' + c.name + ' like ''%[abcdefghijklmnopqrstuvwxyz]%'' COLLATE SQL_Latin1_General_CP1_CS_AS and ' + c.name + ' like ''%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%'' COLLATE SQL_Latin1_General_CP1_CS_AS having count(1) > 0) a' as s
from sys.columns c
inner join sys.types t
on(c.system_type_id = t.system_type_id
and t.name = 'varchar'
)
inner join sys.tables tb
on(c.object_id = tb.object_id)
inner join sys.schemas s
on(tb.schema_id = s.schema_id)
open my_cursor
fetch next from my_cursor into @sql
while @@fetch_status = 0
begin
print @sql
exec(@sql)
fetch next from my_cursor into @sql
end
close my_cursor
deallocate my_cursor
select * from VarcharColumns