2

を使用すると、SSMSのストアドプロシージャから返された列を確認set FMTONLY on;できますが、プログラムでプロシージャ内の列名を取得して、それらを使用して何かを実行したい場合はどうすればよいですか?

基本的に、私が達成したいのはこのようなものです...

declare @columns nvarchar(max) = (
    select name + ', '
    from sys.columns
    where object_id = OBJECT_ID('my_stored_procedure')
    for xml path(''));

明らかに、それは機能しません。これはT-SQLで可能ですか?

4

1 に答える 1

1

OPENQUERYは、可能な解決策の 1 つFMTONLY OFFです。実行結果をダミー テーブルにロードし、その列構造を文字列に構築します。以下は、このメソッドを sproc 形式で示しています。分析された各 sproc が 1 つの行セットのみを返すことを前提としています。

USE AdventureWorks
GO

CREATE PROCEDURE MySprocCols
@ExecStr NVARCHAR(1000)
AS
SET FMTONLY OFF;
SET NOCOUNT ON;

IF EXISTS (
    SELECT 1
    FROM sys.objects o
    INNER JOIN sys.schemas s ON s.schema_id=o.schema_id
    WHERE o.[type]='U'
    AND s.name='dbo'
    AND o.name='MyCols'
)
DROP TABLE dbo.MyCols;

DECLARE @SQL NVARCHAR(1000)
SET @SQL = '
SELECT TOP(0) * 
INTO dbo.MyCols
FROM OPENQUERY(MyServer,'''+@ExecStr+''')';
EXEC SP_EXECUTESQL @SQL;

DECLARE     @Cols VARCHAR(MAX) = '';
DECLARE     @Del varchar(10) = ',';

SELECT      @Cols += @Del + c.name + ''
FROM        sys.objects o
JOIN        sys.schemas s           ON s.schema_id=o.schema_id
JOIN        sys.columns c           ON c.object_id=o.object_id
WHERE       o.[type]='U'
            AND s.name='dbo'
            AND o.name='MyCols'
ORDER BY    c.column_id

SET @Cols = STUFF(@Cols,1,LEN(@Del),'');
PRINT @Cols;
GO

EXEC dbo.MySprocCols 'exec AdventureWorks.dbo.uspGetBillOfMaterials 746,''''9/9/2000''''';
--                          ^Must specify DB name here                    ^ Double-esc ^ all embedded single quotes

-- If you get an error like this:
--Msg 7411, Level 16, State 1, Line 2
--Server 'MyServer' is not configured for DATA ACCESS

-- ..you will first need to enable 'Data Access' through the following Surface Area Config command:
--exec sp_serveroption [MyServer],'Data Access','TRUE'

実行結果の例:

ProductAssemblyID,ComponentID,ComponentDesc,TotalQuantity,StandardCost,ListPrice,BOMLevel,RecursionLevel

于 2012-06-14T03:48:57.787 に答える