3

これはおそらく以前に尋ねられたことがありますが、満足のいく答えを見つけることができませんでした。

次のようなストアド プロシージャの結果を一時テーブルに挿入する必要があります。

INSERT INTO #TEMP EXEC MY_SP

SP が返す列の数が事前にわからないため、#TEMP テーブルを準備して (動的 ALTER .. ADD コマンドを使用して) SP の結果セットに一致する列を追加する必要があります。

前提は - SP はパラメーターを受け入れず、列の数は常に同じです。しかし、たとえば変数に格納できるように、SP 以外の純粋な TSQL でその数を決定するにはどうすればよいですか?

4

4 に答える 4

2

特に、OPENROWSET などの実行に必要なアクセス許可を誰かが拒否している場合は、難しい問題です。

SP をアンパック/スクリプト化し、そのコンテンツを T-SQL に直接追加することを検討しましたか? このようにして、必要に応じて変更して適応させることができます。

それ以外の場合は、SP について詳しく説明できれば:

  • SPは何をしますか?
  • どのような情報を出力しますか? 1-N 列 - 何行?
  • 遅い/速いですか?(ブルートフォース [try-catch] アプローチを使用できますか)?
  • 出力する列はどのように決定され、どのくらいの頻度で変更されるのでしょうか?
  • 何らかの方法で列を事前に決定できますか? (INSERT #temp EXEC sp_getData 構文を使用できるようにするため)。

頑張ってください!

于 2012-07-26T14:19:30.850 に答える
2

少し面倒ですが、次のようなことができます。

SELECT * INTO #temp 
FROM OPENROWSET('SQLOLEDB','Data Source=MyServer;Trusted_Connection=yes;Integrated Security=SSPI', 'EXECUTE MyDB.MySchema.MyProcedure @MyParm=123')

ストアド プロシージャの出力の形状を事前に知る必要がないように、SELECT INTO のような EXECUTE INTO 構文を要求しましたが、拒否されました。

于 2012-07-23T19:03:43.927 に答える
1

最初から、これを実行する必要がある場合は、SQL環境などの外部で実行する方法を見つけようとします。これは、提供しているソリューションがこれを実行するための適切な方法ではないためですが、機能します。だから私はこれが良い考えだと言っているのではありません。私はテストと呼ばれるspを持っています:

CREATE PROCEDURE Test
AS
SELECT 1 as One, 2 as Two

これを動的に実行するには、次のようにします。

DECLARE @i int
SET @i = 1;
DECLARE @SUCESS bit 
SET @SUCESS = 0
WHILE(@SUCESS = 0)
BEGIN 
  DECLARE @proc VARCHAR(MAX)
  DECLARE @count int
  SET @count = 1
  SET @proc = 'DECLARE @t TABLE ( c1 varchar(max) '
  WHILE @count < @i 
  BEGIN 
    SET @proc = @proc + ', c' + CONVERT(varchar, @count + 1) + ' varchar(max) '
    print @proc 
    SET @count = @count + 1
  END
  SET @proc = @proc + '); INSERT INTO @t EXEC Test'
  BEGIN TRY
    EXEC(@proc);
    SET @SUCESS = 1
  END TRY
  BEGIN CATCH
    SET @i = @i+1
  END CATCH

END

SET @proc = @proc + '; SELECT * into ##t FROM @t '
EXEC( @proc )

SELECT * from ##t

列のデータ型や名前などが失われているため、これは問題の解決策としては不十分です。

于 2012-07-28T20:48:20.870 に答える
0

構文がわかりません。これはおそらく最善の方法ではありませんが、誰かが xml に変換して解析することでこれを行ったようです: Dynamic query results into a temp table or table variable

于 2012-07-28T23:11:55.667 に答える