问题: 我有一个程序(简化),由.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。但这将是很多工作(许多不同的程序)。有没有可行的全球方法?
谢谢你,祝你有愉快的一天
答案 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