2016-10-05 155 views
0

これは以前に尋ねられたことがわかりました。私は以前の回答を研究し、私の問題の解決策を見つけることができませんでした。私の場合、最も興味深いのは、まったく同じコードでも、テストデータベースでは全く同じコードが動作するが、プロダクションでは動作しないということです。手順自体は非常に長いですが、私は問題のある部分を分離することができました。データ型nvarcharとnvarcharは、減算演算子で互換性がありません

DECLARE luUpdateCursor CURSOR FORWARD_ONLY STATIC READ_ONLY FOR 
    SELECT Id, DisplayFormat, LookupName FROM #ProductResults WHERE Value IS NOT NULL AND LEN(LTRIM(RTRIM(LookupName))) > 0 

OPEN luUpdateCursor 

FETCH NEXT FROM luUpdateCursor 
INTO @Id, @DisplayFormat, @LookUpName 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    IF @LocaleID = @SystemLocaleId 
     BEGIN 
      SET @strSql = ' 
       UPDATE PR 
        SET PR.Value = ' + REPLACE(REPLACE(@DisplayFormat,'[','lk.['),',' , '+ '','' + ') + '   
      FROM 
       #ProductResults PR 
      INNER JOIN 
       tblk_' + RTRIM(@LookUpName) + ' lk WITH(NOLOCK) ON PR.Value = lk.Id 
      WHERE 
       PR.Id = ' + CONVERT(NVARCHAR,@Id) 
    END 
ELSE 
    BEGIN 
     SET @strSql = ' 
      UPDATE PR 
       SET PR.Value = COALESCE(' + REPLACE(REPLACE(@DisplayFormat,'[','lkl.['),',' , '+ '','' + ') + ',' + REPLACE(REPLACE(@DisplayFormat,'[','lk.['),',' , '+ 
'','' + ') + ')    
      FROM 
       #ProductResults PR 
      INNER JOIN 
       tblk_' + RTRIM(@LookUpName) + ' lk WITH(NOLOCK) ON PR.Value = lk.Id 
      LEFT OUTER JOIN 
       tblk_' + RTRIM(@LookUpName) + '_Locale lkl WITH(NOLOCK) ON PR.Value = lkl.fk_Id AND lkl.FK_Locale = ' + CAST(@LocaleID AS NVARCHAR(20)) + ' 
      WHERE 
       PR.Id = ' + CONVERT(NVARCHAR,@Id) 
    END 
    EXECUTE sp_executesql @strSql; 
    FETCH NEXT FROM luUpdateCursor 
    INTO @Id, @DisplayFormat, @LookUpName 
END 
CLOSE luUpdateCursor 
DEALLOCATE luUpdateCursor; 

表の#ProductREsultsは、ID INTを持っている、とをdisplayFormatとLookupNAmeは両方NVARCHARです:私は誰かが、私はこの上の2日間を失い、まだ見当がつかないので、私にはない何かを見ている願っています。プロシージャ内にも非常によく似たクエリが1つありますが、実際には同じですが、異なるテーブルにあり、そのテーブルが動作しています。 ご質問が愚かな場合は申し訳ありません。

+0

どのラインでエラーが発生しますか? –

+0

こんにちはBiljanaさん、より良い変換するか、文字列データ型を明示的にintに数学的演算のために – Eralper

+0

@strSqlを上記のようにconcatinatingすると、結果の1つがNULLを返す場合、結果としてNULLを生成することに注意してください。 ISNULLでチェックするか、CONCAT関数を使用するか(SQL Server 2012以降を使用している場合 - https://msdn.microsoft.com/en-us/library/hh231515.aspx) – Jens

答えて

0

このエラーは、 "データ型nvarchar(max)とnvarchar(max)は減算演算子では互換性がありません。データ型が2つの変数または列をnvarcharとして減算するとスローされます。 サブストラクト演算子を実行する場所、または起こっている可能性のある他のクエリを探します。

関連する問題