SQL Server の動的 SQL ステートメントにテーブル変数を渡す
ストアド プロシージャを構築する場合、動的 SQL ステートメントで宣言されたテーブル変数を参照するという課題に遭遇することがあります。これにより、変数を宣言する必要があることを示すエラーが発生する場合があります。
次の例を考えてみましょう:
<code class="language-sql">set @col_name = 'Assoc_Item_' + Convert(nvarchar(2), @curr_row1); set @sqlstat = 'update @RelPro set ' + @col_name + ' = (Select relsku From @TSku Where tid = ' + Convert(nvarchar(2), @curr_row1) + ') Where RowID = ' + Convert(nvarchar(2), @curr_row); Exec(@sqlstat);</code>
このステートメントを実行すると、次のエラーが発生する可能性があります:
この問題を解決するには、テーブル値パラメーター (TVP) を使用できます。 TVP を使用すると、テーブル変数を明示的に宣言せずに動的 SQL ステートメントに渡すことができます。ただし、このメソッドはテーブル内の値の更新には使用できないことに注意してください。
たとえば、次の変更されたコードを考えてみましょう:
<code class="language-sql">CREATE TYPE MyTable AS TABLE ( Foo int, Bar int ); GO DECLARE @T AS MyTable; INSERT INTO @T VALUES (1,2), (2,3) SELECT *, sys.fn_PhysLocFormatter(%%physloc%%) AS [physloc] FROM @T EXEC sp_executesql N'SELECT *, sys.fn_PhysLocFormatter(%%physloc%%) AS [physloc] FROM @T', N'@T MyTable READONLY', @T=@T </code>
このコードは、サブスコープ (動的ステートメント内) で参照されるテーブル変数が外側のスコープのテーブル変数と同じであることを示しており、エラーが回避されています。 重要なのは、sp_executesql
を使用して TVP タイプとパラメーターを正しく宣言することです。 更新操作の場合は、カーソルやその他の代替手段を使用するなど、別のアプローチが必要です。
以上がSQL Server でテーブル変数を動的 SQL ステートメントに渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。