ホームページ > データベース > mysql チュートリアル > SQL Server でテーブル変数を動的 SQL ステートメントに渡す方法

SQL Server でテーブル変数を動的 SQL ステートメントに渡す方法

Linda Hamilton
リリース: 2025-01-10 16:54:44
オリジナル
519 人が閲覧しました

How to Pass Table Variables to Dynamic SQL Statements in SQL Server?

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>
ログイン後にコピー

このステートメントを実行すると、次のエラーが発生する可能性があります:

  • テーブル変数「@RelPro」を宣言する必要があります。
  • テーブル変数「@TSku」を宣言する必要があります。

この問題を解決するには、テーブル値パラメーター (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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート