临时程序会弄乱整理

时间:2017-12-08 10:22:26

标签: sql-server stored-procedures procedure collation tempdb

问题: 我有一个程序(简化),由.NET应用程序创建:

create procedure #SaveData
@InValue varchar(128)
as
begin
    insert into Production.TargetTable (PREFIX_Value) select @InValue
end

问题是,数据库使用 SQL_SLOVAK_CP1250_CI_AS 排序规则。 TempDB使用默认的 SQL_Latin1_General_CP1_CI_AS 排序规则。

问题简化:

-- this doesnt work, returns RTC
create procedure #SaveData
@InValue varchar(128)
as
begin
    select @InValue
end

-- this doesnt work, returns RTC
create procedure #SaveData
@InValue varchar(128)
as
begin
    select @InValue collate SQL_SLOVAK_CP1250_CI_AS
end

-- this does work, returns ŘŤČ
create procedure SaveData
@InValue varchar(128)
as
begin
    select @InValue
end

这导致代替测试字符串ŘŤČ而保存 RTC 。 当我从过程名称中删除#并且不将其创建为临时过程时,一切正常。

现在,发现一个可行的修复方法是将param类型从varchar更改为nvarchar。但这将是很多工作(许多不同的程序)。有没有可行的全球方法?

谢谢你,祝你有愉快的一天

1 个答案:

答案 0 :(得分:0)

问题在于列整理。传递给它的任何值都会将其排序规则更改为列排序规则:

declare @table table(txt varchar(10) collate SQL_Latin1_General_CP1_CI_AS)
insert into @table values ('ŘŤČ' collate SQL_SLOVAK_CP1250_CI_AS)
--result will be changed, even with explicit collation
select * from @table
go

declare @table table(txt varchar(10) collate SQL_SLOVAK_CP1250_CI_AS)
insert into @table values ('ŘŤČ')
--correct output
select * from @table
go

所以你必须在列中更改排序规则:

alter table TABLE_NAME alter column TextCol varchar(...) collate SQL_SLOVAK_CP1250_CI_AS