我的问题发生在“简单即得”的IF语句中,这使得对许多类似问题(例如Cannot resolve the collation conflict in my query)的建议修正似乎毫无用处。
错误信息是:
Msg 468,16级,状态9,过程#XYZ,第11行 无法解决"Latin1_General_CI_AS“和"SQL_Latin1_General_CP1_CI_AS”在等效操作中的排序规则冲突。
众所周知,服务器排序规则设置为SQL_Latin1_General_CP1_CI_AS
。
这个查询演示了这个问题:
-- this procedure (which gets put into tempdb) is called WITHOUT specifying @Choice
CREATE PROCEDURE #XYZ
(
-- all other parameters removed (none of them have default values)
@Choice AS NVARCHAR(1) = 'Y'
)
AS
BEGIN
IF (@choice = 'Y') -- error raised here
BEGIN
DECLARE @NULL_STATEMENT AS int -- only here because there's no "do nothing" statement
END
RETURN
END
考虑到更改服务器(和/或所有表)的默认排序规则不会发生,因此如何解决这个问题,在所有查询、表等中插入“排序规则DATABASE_DEFAULT”是不切实际的(有关此解决方案,请参阅https://www.mssqltips.com/sqlservertip/4395/understanding-the-collate-databasedefault-clause-in-sql-server/和Cannot resolve the collation conflict between temp table and sys.objects)。
密切相关的联系:
排序规则子句的文档:https://learn.microsoft.com/en-us/sql/t-sql/statements/collations?view=sql-server-2017
一个我可能无法使用的解决方案:https://www.mssqltips.com/sqlservertip/2901/how-to-change-server-level-collation-for-a-sql-server-instance/
发布于 2018-09-10 16:09:37
我总结了@Sean (@Lamak的评论的一个变体)提供的答案,因为它在我能够接受之前就被删除了。
问题(详见对原始问题的评论)是我碰到了一个问题!同时将工作代码移动到新服务器。修正是将默认参数从ASCII (varchar)更改为nvarchar (UTF-8)形式:
CREATE PROCEDURE #XYZ
(
-- all other parameters removed (none of them have default values)
@Choice AS NVARCHAR(1) = N'Y' -- Note the leading N
)
AS
....
最重要的是,在运行该版本之后,我能够删除前面的N,并且查询没有出现问题。
https://stackoverflow.com/questions/52228546
复制相似问题