0

重複の可能性:
動的SQLステートメントでテーブル変数を使用する方法は?

TEMPORARY TABLEでやりたいことを実行すると、正常に機能します。

DECLARE @CTRFR VARCHAR(MAX)

SET @CTRFR = 'select blah blah blah' -- <-- very long select statement. this returns a 0 or some greater number. Please note! --> I NEED THIS NUMBER.

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo][#CTRFRResult]') AND type IN (N'U') ) 
   DROP TABLE [dbo].[#CTRFRResult]

CREATE TABLE #CTRFRResult
(
  CTRFRResult VARCHAR(MAX)
)

SET @CTRFR = 'insert into #CTRFRResult ' + @CTRFR
EXEC(@CTRFR)

上記は問題なく動作します。

問題は、複数のデータベースが同じTEMPテーブルを使用していることです。したがって、(一時テーブルの代わりに)VARIABLEテーブルを使用する必要があります。

以下にあるものは、テーブルを宣言する必要があると言っているため、機能していません。

DECLARE @CTRFRResult TABLE
(
   CTRFRResult VARCHAR(MAX)
)

SET @CTRFR = 'insert into @CTRFRResult ' + @CTRFR -- I think the issue is here.
EXEC(@CTRFR)

テーブル名がスコープ外であると想定しているため、に設定@CTRFRしても機能しません。insert into...変数テーブルを使用して一時テーブルコードを模倣するにはどうすればよいですか?

私が受け取っているエラーメッセージは次のとおりです。

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

4

3 に答える 3

1

そのような動的 SQL で @ テーブルを使用することはできません。動的 SQL ステートメント内でもテーブルを作成する必要があります。

しかし、# テーブルを使用することにまったく問題があるとは思いません。

# テーブルは現在のセッションでのみ使用できます。何百ものセッションでそれぞれ独自のバージョンを問題なく作成できます。

他のセッションがアクセスできる一時テーブルを作成する場合は、代わりに ## を使用する必要があります。

于 2012-09-18T21:40:40.543 に答える
0

テーブル変数をパラメータとして動的SQLまたは別のストアドプロシージャに送信することについてできることは何もありませんが、特定のケースでは引き続き使用できます。それ以外の

SET @CTRFR = 'insert into @CTRFRResult ' + @CTRFR -- I think the issue is here.
EXEC(@CTRFR)

あなたは置くかもしれません:

insert into @CTRFRResult
  exec sp_executesql @CTRFR
于 2012-09-18T22:00:42.720 に答える
0

exec独自のスコープで実行されるため、このようなテーブル変数に挿入することはできません。

Erland Sommarskog のThe Curse and Blessings of Dynamic SQL から:

次に観察することは、動的 SQL がストアド プロシージャの一部ではなく、独自のスコープを構成していることです。動的 SQL のブロックを呼び出すことは、アドホックに作成された名前のないストアド プロシージャを呼び出すことに似ています。これには多くの影響があります。

動的 SQL のブロック内では、ローカル変数 (テーブル変数を含む) または呼び出し元のストアド プロシージャのパラメーターにアクセスできません。ただし、sp_executesql を使用すると、パラメーターを動的 SQL のブロックに渡すことができます。

于 2012-09-18T21:40:51.267 に答える