SQL Server在它们相同时使用不同的case查找和更新值

时间:2013-10-05 12:00:33

标签: sql sql-server

我试图匹配相同的值,但例如使用不同的大小写字母。

value1=TesT
value2=test

我有2列我想要同步我做了一个同步很好的程序,但没有同步具有不同大小写字母和相同值的值。

我不插入所有的内容每次我想运行需要很长时间的过程时,从column1到column2的值。

这是我的查询

DECLARE nam CURSOR FOR
select ipaname, ipaadr, vidname, vidadr, ipadogno as dogno from tmpNames
        DECLARE @dogno varchar(5)
        DECLARE @ipaname VARCHAR(200)
        DECLARE @ipaadr VARCHAR(200)
        DECLARE @vidname VARCHAR(200)
        DECLARE @vidadr VARCHAR(200)
open nam
    fetch next from nam into @ipaname, @ipaadr, @vidname, @vidadr, @dogno
    while @@FETCH_STATUS = 0 BEGIN
        DECLARE @sync varchar(200)
if @ipaname!=@vidname or @ipaadr!=@vidadr begin
            set @sync = 'update client set name=''' +cast(@vidname as VARCHAR(max))+ ''', adr=''' +cast (@vidadr as varchar(max))+ ''' where dogno=''' + @dogno + '''' 
            Execute(@sync) at ipacct5
            end
    fetch next from nam into @ipaname, @ipaadr, @vidname, @vidadr, @dogno
END
close nam
deallocate nam

1 个答案:

答案 0 :(得分:0)

Sql Server默认排序规则是Case insensitive(我认为这就是你的问题)。如果您需要进行区分大小写搜索,请使用SQL_Latin1_General_CP1_CS_AS归类。

您可以将当前的服务器排序规则检查为:

SELECT SERVERPROPERTY ('Collation')

如果显示"...CI..",则表示不区分大小写,否则应为"...CS.."

以下是有关如何在比较时使用归类的示例( Demo here ):

declare @s1 nvarchar(10) = 'Test',
        @s2 nvarchar(10) = 'test'

--Here Test = test
if (@s1 = @s2)  SELECT 'CASE INSENSITIVE';

declare @s1 nvarchar(10) = 'Test',
        @s2 nvarchar(10) = 'test'

--In this case, Test <> test
if (@s1 != @s2 Collate SQL_Latin1_General_CP1_CS_AS) SELECT 'CASE SENSITIVE';

另外,我认为您可能不需要游标,请将其替换为以下更新查询。

--Check the SELECT query first and if okay comment SELECT and uncomment UPDATE
select c.name, t.vidname , c.adr, t.vidadr 
--update c set c.name=t.vidname , c.adr=t.vidadr 
from client c 
      join tmpNames t on c.dogno= t.ipadogno
where (t.ipaname != t.vidname Collate SQL_Latin1_General_CP1_CS_AS)
      or (t.ipaadr != t.vidadr Collate SQL_Latin1_General_CP1_CS_AS)