【发布时间】:2018-05-22 13:51:12
【问题描述】:
问题: 我有一个由 .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 而不是测试字符串 ŘŤČ。 当我从过程名称中删除 # 并且不将其创建为临时过程时,一切正常。
现在,一种可行的解决方法是将参数类型从 varchar 更改为 nvarchar。但这将是很多工作(许多不同的程序)。有没有可行的全局方法?
谢谢你,祝你有美好的一天
【问题讨论】:
-
也许您应该将服务器的排序规则更改为 SQL_SLOVAK_CP1250_CI_AS?
-
@DenisRubashkin 会尝试,但似乎是一个核武器选项。可能是同时在服务器上运行的具有不同排序规则的其他数据库。
标签: sql-server stored-procedures procedure collation tempdb