0

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

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
4

1 回答 1

0

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

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

SELECT SERVERPROPERTY ('Collation')

如果它说"...CI..",那意味着不区分大小写,否则它应该是"...CS.."

以下是关于如何在比较中使用排序规则的示例(此处为演示):

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)
于 2013-10-05T12:16:57.133 回答