0

私は巨大な動的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か?

4

1 に答える 1

1

読み直しの際、データ型はすでにわかっているので、update句に含めてみませんか?

set @updateClause = 'Column1 = cast(@newValue as varchar(10))';
set @updateClauseDataType = 'varchar(10)';

または、データ型を2回入力しないようにするには:

set @updateClauseDataType = 'varchar(10)';
set @updateClause = 'Column1 = cast(@newValue as ' +
    @updateClauseDataType + ')';
于 2009-11-13T23:15:59.773 に答える