首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IF语句中的Server排序问题(Msg 468、级别16、状态9)

IF语句中的Server排序问题(Msg 468、级别16、状态9)
EN

Stack Overflow用户
提问于 2018-09-07 19:25:02
回答 1查看 7.8K关注 0票数 3

我的问题发生在“简单即得”的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

这个查询演示了这个问题:

代码语言:javascript
运行
复制
-- 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/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-10 16:09:37

我总结了@Sean (@Lamak的评论的一个变体)提供的答案,因为它在我能够接受之前就被删除了。

问题(详见对原始问题的评论)是我碰到了一个问题!同时将工作代码移动到新服务器。修正是将默认参数从ASCII (varchar)更改为nvarchar (UTF-8)形式:

代码语言:javascript
运行
复制
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,并且查询没有出现问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52228546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档