1

これは理想的ではないことはわかっていますが、動的SQLに基づいて一時テーブルにデータを入力できるかどうか知りたいですか?

私が達成したいことと非常によく似た例が、この回答に次のように示されています

SELECT into #T1 execute ('execute ' + @SQLString )

また

INSERT into #T1 execute ('execute ' + @SQLString )

どちらも働けませんでした。編集から、最初のオプションが間違っていたように思われるので、2番目のオプションについては次のようなものを試しました。

DECLARE @SQLString VARCHAR (2000) = 'SELECT * FROM INFORMATION_SCHEMA.COLUMNS'

INSERT into #MyTempTable execute (@SQLString )

どんなアイデアでも大歓迎です。

編集:

ローカライズされすぎずに何をしようとしているのかを明確にするために、以下にできる限り簡単に説明します。

データベースのステージング領域に、動的な名前と動的な数の列を持つテーブルを含むデータがあります。ただし、いくつかの列名は各テーブルで同じです。動的SQLですべてを構築するのではなく、既知の列を一時テーブル(またはテーブル変数、CTE、派生テーブルなど)に単純に抽出し、それに基づいて動作できるようにしたいと思います。

したがって、そのようにテーブルが与えられます。

  CREATE TABLE SomeParticularNameThatCantBeKnownToAStoredProc (
      [1] AS VARCHAR(100),
      [2] AS VARCHAR(100),
      ... -- Could be any number of these columns
      [Id] AS INT,
      [KnownCol] AS VARCHAR(100),
      [KnownCol2] AS VARCHAR(100),
      ....
      [DboId] AS INT
  )

動的SQLですべてを実行しなくても、このデータを処理できるようにするために必要な操作を実行できるようにしたいと思います。私は次のようなことができることを望んでいました。

  DECLARE @TableName AS VARCHAR(1000) = 'SomeParticularNameThatCantBeKnownToAStoredProc'

  SELECT [Id], [KnownCol], [KnownCol2], [DboId] 
  INTO #KnownName
  FROM @TableName -- I know this isn't possible, but this is what I'd like to do

これにより、一貫性のある#KnownNameに対してSQLステートメントを実行できるようになります。他の既存のテーブルに関連付けるためにデータを使用する、ステージングテーブルから同等のdboスキーマにデータをコピーする、MERGEを使用してDboIdをステージングテーブルIDと照合するなど、私が行う必要のある他の操作のいくつかは非常に時間がかかります。ここで説明されているように、OUTPUTINTOなど。

テーブル名が動的であるという事実を考慮して、書き込む必要のある動的SQLの量を制限できる他の方法を考えられる場合は、お知らせください。

4

1 に答える 1

2

#MyTempTable が既に存在すると仮定します。

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * FROM INFORMATION_SCHEMA.COLUMNS;';
INSERT #MyTempTable EXEC sp_executesql @SQLString;

それ以外の場合は、何をしようとしているのかを明確にしてください。テーブルがまだ作成されていない場合は、動的 SQL 内ですべてを行うことができます。

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * INTO #MyTempTable FROM INFORMATION_SCHEMA.COLUMNS;
  SELECT * FROM #MyTempTable;';
EXEC sp_executesql @sql;
于 2012-08-07T13:48:55.223 に答える