これは以前に尋ねられたことがわかりました。私は以前の回答を研究し、私の問題の解決策を見つけることができませんでした。私の場合、最も興味深いのは、まったく同じコードでも、テストデータベースでは全く同じコードが動作するが、プロダクションでは動作しないということです。手順自体は非常に長いですが、私は問題のある部分を分離することができました。データ型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つありますが、実際には同じですが、異なるテーブルにあり、そのテーブルが動作しています。 ご質問が愚かな場合は申し訳ありません。
どのラインでエラーが発生しますか? –
こんにちはBiljanaさん、より良い変換するか、文字列データ型を明示的にintに数学的演算のために – Eralper
@strSqlを上記のようにconcatinatingすると、結果の1つがNULLを返す場合、結果としてNULLを生成することに注意してください。 ISNULLでチェックするか、CONCAT関数を使用するか(SQL Server 2012以降を使用している場合 - https://msdn.microsoft.com/en-us/library/hh231515.aspx) – Jens