私は巨大な動的SQLステートメントをリファクタリングしてきましたが、障害にぶつかった可能性があると思います。目標はそれをパラメータ化することでした。SQLServer2005を使用しています。
@i
更新する必要のある列を決定するint変数( )があります。これが私がやってきたことです:
if @i = 1
begin
set @updateClause = 'Column1 = @newValue';
set @updateClauseDataType = 'varchar(10)';
set @updateValue = @foo;
end
else if @i = 2
begin
set @updateClause = 'Column2 = @newValue';
set @updateClauseDataType = 'int';
set @updateValue = @bar;
end
else if ...
次に、ステートメントを実行しようとします。
set @statement = N'update ' + @server_name + '.' + @database_name + '.dbo.Table1
set ' + @updateClause + ' where pk = @pk';
set @parameters = '@newValue ' + @updateClauseDataType + ',
@pk uniqueidentifier';
execute sp_executesql @statement,
@parameters,
@newValue = @newValue,
@pk= @pk;
これにより、次のようになります。
データ型sql_variantからvarcharへの暗黙的な変換は許可されていません。CONVERT関数を使用して、このクエリを実行します。
@updateValue
にテキストとして保存した正しいタイプになんらかの方法でキャストできれば、これを回避できます@updateClauseDataType
。の値を調べる巨大なifステートメントがなくてもこれを実行できる方法はあります@updateClauseDataType
か?