"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)
通过动态创建 linq 查询,在 c# 中为 Sql Equivalent “column is null”创建 Linq 表达式