“NVARCHAR(255)为空”带来整理冲突

时间:2012-10-01 19:56:19

标签: sql tsql

我有一个临时程序:

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

为什么“为空”需要整理?

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

1 个答案:

答案 0 :(得分:3)

使用明确的collat​​e子句

if(@listItemEnName COLLATE Latin1_General_CI_AS is not null)

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

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

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

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

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

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