1

テーブルをパラメータとして受け取るプロシージャがあります。記入してから、最初のプロシージャを実行する別のプロシージャに戻す必要があります。しかし、問題は、y をコンパイルすると、次のエラー メッセージが表示されることです。

Mens 352、Nivel 15、Estado 1、Procedimiento Person_InsertCloud、Línea 1
テーブル値パラメーター「@TableServerIds」は、READONLY オプションで宣言する必要があります。

パラメータとしてテーブルを変更することはできませんか? 他にどのようなオプションがありますか?

ありがとう

4

2 に答える 2

3

いいえ、TVP の内容は変更できません。この機能が必要な場合は、SP が相互に呼び出すときにテーブル パラメーターを読み取り専用にする必要があるという制限を緩和します

もう 1 つのオプションは、ローカル#tempテーブルです。#tempストアド プロシージャには、親スコープで作成されたテーブルへの読み取りおよび書き込みアクセス権があります。ただし、これは、sub プロシージャの呼び出し元がこの要件を認識し、#temp呼び出す前に予期されるテーブルを作成する必要があることを意味します。

以下の例

CREATE PROC P1
AS
    CREATE TABLE #Foo
      (
         X VARCHAR(50)
      );

    EXEC P2;

    SELECT *
    FROM   #Foo;

GO

CREATE PROC P2
AS
    IF OBJECT_ID('tempdb..#Foo') IS NULL
      BEGIN
          RAISERROR ('This procedure expects table #Foo to already exist',16,1);

          RETURN;
      END

    INSERT INTO #Foo
    VALUES      ('Inserted by P2')

GO

EXEC P1 
于 2013-01-05T16:23:45.467 に答える
2

パラメータとしてテーブルを変更することはできませんか?

いいえ。これは TVP の制限の 1 つです。

制限は文書化されています:

テーブル値パラメーターは、入力 READONLY パラメーターとして Transact-SQL ルーチンに渡す必要があります。ルーチン本体のテーブル値パラメーターに対して、UPDATE、DELETE、INSERT などの DML 操作を実行することはできません。

テーブルを埋める代わりに、 を使用して 2 番目のストアド プロシージャからテーブルを返すSELECTことができます。

于 2013-01-05T16:23:56.150 に答える