"NVARCHAR(255) is null" 带来排序规则冲突

Posted

技术标签:

【中文标题】"NVARCHAR(255) is null" 带来排序规则冲突【英文标题】:"NVARCHAR(255) is null" brings collation conflict 【发布时间】:2012-10-01 19:56:19 【问题描述】:

我有一个临时程序:

CREATE PROCEDURE 
#update_ListItemEntityNumberValueAndLocalizations(
    @modelPrefix NVARCHAR(255), 
    @definitionNeutralName NVARCHAR(255), 
    @listItemNeutralValue NVARCHAR(255),    
    @newNumberValue float,
    @listItemEnName NVARCHAR(255),
    @listItemDeName NVARCHAR(255))

在这个过程中有如下的if语句:

if(@listItemEnName is not null)

在这一行我收到以下错误:

无法解决之间的排序规则冲突 “SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”是 不操作。

有谁知道为什么会发生这种情况以及如何避免它?

更新:数据库排序规则是SQL_Latin1_General_CP1_CI_AS

为什么“is null”需要排序规则?

有没有办法强制转换 null 或设置参数的排序规则?

【问题讨论】:

***.com/questions/1607560/… 我在研究过程中也发现了这一点,但我真的不知道这对我有什么帮助......我没有任何表格或列,只有一个参数 =/ @Dominik_Kirschenhofer 检查其余代码是否存在排序规则冲突,错误的行号可能不正确 【参考方案1】:

使用明确的整理子句

if(@listItemEnName COLLATE Latin1_General_CI_AS is not null)

或者取决于存储过程将上下文切换到USE tempdb;,然后创建临时存储过程,然后将上下文切换回原始数据库,可能如下所示。

您正在创建一个临时存储过程,因此该参数将被视为具有tempdb 的排序规则。但是tempdb 的排序规则必须与您的用户数据库不同。

据我所知,当第一次创建存储过程时,它被绑定到正在使用的数据库上下文中(即使后来ALTER-ed 来自不同的数据库上下文)。

。例如我正在使用区分大小写的排序规则,但如果我在不区分大小写的数据库中创建以下过程

CREATE PROC #Foo2 
AS
IF 'a' = 'A'
    PRINT 'Yes'
SELECT *
FROM sys.database_files 

无论我从哪个数据库运行它,或者如果我在USE-ing 另一个数据库时更改它,它都会继续打印“是”并返回有关原始数据库文件的信息。

【讨论】:

似乎有效,非常感谢!您能否也解释一下为什么“in not null”需要使用排序规则? @DominikKirschenhofer - 我想不出任何原因。 @SQLkiwi - 谢谢!我确实搜索了连接,但正在寻找有关临时存储过程的内容,所以没有找到。

以上是关于"NVARCHAR(255) is null" 带来排序规则冲突的主要内容,如果未能解决你的问题,请参考以下文章

为长文本字符串覆盖流利的 NHibernate nvarchar(MAX) 而不是 nvarchar(255)

js火狐报错event is not defined

通过动态创建 linq 查询,在 c# 中为 Sql Equivalent “column is null”创建 Linq 表达式

总是使用nvarchar(MAX)有什么缺点吗?

弱类型整数大小比较绕过

基于ef core 2.0的数据库增删改审计系统