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 に答える