0

他のストアド プロシージャの名前を表す文字列引数を受け取るストアド プロシージャ (SQL Server) を作成しています。この文字列には、保存されているすべてのパラメーターも含まれているため、実行するには、EXEC @vSpCommand.

ここで問題が発生します。私の手順は多用途の SP を処理できる必要があるため、結果テーブルがどのようになるかわかりません。つまり、テーブルに含まれる列の数と、各列の型がわからないということです。

さらに、指定された SP ( @vSpCommand) 内に、別の格納された別の動的呼び出しがある場合があります。したがって、使用しても機能しOPENROWSETません。私は次のことを試しました:

SET @vSpCommand = REPLACE(@vSpCommand,'''','''''')

SET @vCmd =  'IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[TA_SpTable'+@vExecId+']'') AND type in (N''U''))
DROP TABLE TA_SpTable'+@vExecId+' SELECT * INTO TA_SpTable'+ @vExecId+' FROM OPENROWSET(''SQLOLEDB'', ''Server=SERVERNAME,3180;Trusted_Connection=Yes'',
''EXEC '+@vSpCommand+ ''')'

EXEC (@vCmd)

成功せずに。

問題は、この SP の結果をテーブルに挿入する方法です。

それが不可能な場合を除き、SQL 内でのソリューションが優先されます。それ以外の場合は、.NET CLR の使用もオプションです。

4

2 に答える 2

0

SP を関数に変換してから、SELECT INTO ステートメントを使用します。

CREATE FUNCTION MyFunction()
RETURNS TABLE
AS
RETURN SELECT 'a' as A, 'b' as B
GO

SELECT *
INTO MyTable
FROM MyFunction()
GO

SELECT * FROM MyTable
GO
于 2013-12-15T13:52:45.500 に答える
0

これを実行する前に、データベースにアドホック権限を設定する必要があります

sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

あなたが試したのと同じ方法でこれを試してみてください。ただし、コードにいくつかの変更があります。簡単に手に入れることができます。

DECLARE @vSpCommand NVARCHAR(500),@vCmd NVARCHAR(4000)

SET @vSpCommand = Replace('TestDB.dbo.spg_GetNames', '''', '''''')
SET @vCmd =   'IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[TA_SpTable]'') AND type in (N''U''))
                    DROP TABLE TA_SpTable' 
            + ' select a.* into TA_SpTable from openrowset(''SQLNCLI'',''Server=.;Trusted_Connection=yes;'',''SET NOCOUNT ON;SET FMTONLY OFF; exec '+ @vSpCommand +''') AS a'

PRINT @vCmd
EXEC (@vCmd) 

select * from TA_SpTable

データベース「TestDB」のSP「spg_GetNames」を使用したことに注意してください。コードは自由に変更できます。ヘルプが必要な場合はコメントしてください。

于 2013-12-15T14:47:49.947 に答える