2012-10-01 23 views
1

我有一個臨時步驟:「NVARCHAR(255)爲空」 帶來整理confict

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) 

並且在該行我收到以下錯誤:

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the is not operation.

有沒有人知道爲什麼會發生這種情況,以及如何避免它?

UPDATE:數據庫歸類爲SQL_Latin1_General_CP1_CI_AS

爲什麼一個 「爲空」 需要覈對?

有沒有辦法來轉換null或設置參數的排序規則?

+0

http://stackoverflow.com/questions/1607560/cannot-resolve-the-collat​​ion-conflict-between-sql-latin1-general-cp1-ci-as-and –

+0

我在研究期間也發現了這個,我不知道這應該如何幫助我......我沒有任何表或列,只是一個參數=/ –

+0

@Dominik_Kirschenhofer檢查其餘的代碼整理衝突,錯誤的行號可能不合並 – TFD

回答

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 -ing繼續到不同的數據庫打印「是」並返回有關原始數據庫文件的信息。

+0

似乎工作, 萬分感謝! 你也可以解釋爲什麼「in not null」需要使用排序規則? –

+0

@DominikKirschenhofer - 我想不出有任何理由。 –

+2

@DominikKirschenhofer'NULL'排序規則是一個bug,2012年修復。參見[本連接錯誤報告](https://connect.microsoft.com/SQLServer/feedback/details/652116/scalar-變量 - 整理 - 錯誤 - 兩不同,但相關-問題於一身,簡單的腳本)。 –

相關問題