1

我有一个临时程序:

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)

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

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

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

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

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

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

4

1 回答 1

3

使用显式整理子句

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使用不同的数据库时更改它,它都会继续打印“是”并返回有关原始数据库文件的信息。

于 2012-10-01T20:16:13.253 回答