我想你可以使用sp_describe_first_result_set(可從SQL2012)和FMTONLY找到你的存儲過程結果模式。像這樣的東西:
EXEC sp_describe_first_result_set
@tsql = N'SET FMTONLY OFF; EXEC yourProcedure <params are embedded here>'
更多細節可以發現here。但是,如果我沒有記錯的話,只有當你的程序使用了確定性模式(沒有SELECT INTO #tempTable或類似的東西)時,它才起作用。
找出結果模式的一個訣竅就是將結果實際地物化爲臨時創建的表格。但是,這並不容易,因爲SELECT INTO
不適用於EXEC procedure
。一個解決方法是:
1)定義一個鏈接服務器到實例本身。例如。環回
2)執行你的程序是這樣的(對於SQL 2008R2
):
SELECT * INTO tempTableToHoldDataAndStructure
FROM OPENQUERY(' + @LoopBackServerName + ', ''set fmtonly off exec ' + @ProcedureFullName + ' ' + @ParamsStr
其中
@LoopBackServerName = 'loopback'
@ProcedureFullName = loopback.database.schema.procedure_name
@ParamsStr = embedded parameters
對於SQL2012
我覺得如果不提供結果集的執行可能會失敗(即模式定義的預期結果,這在這種情況下是種雞蛋問題):
' WITH RESULT SETS ((' + @ResultSetStr + '))'');
請提供實際的代碼。 – dfundako
「包裝」是「INSERT ... EXEC」? –
我可以發佈包裝代碼,但我不確定沒有我包裝的3000行代碼會有幫助。下面我找到了一個解決方法來回答我自己的問題,但爲了澄清,我的「包裝器」包括聲明過程中的所有參數與包裝過程相同,然後使用EXEC執行該過程,然後是相同的參數列表。在這兩者之間是一個「DECLARE @ReportSet TABLE」,包含我期望從包裝過程中獲得的所有字段和數據類型,以及「INSERT INTO @ReportSet」。 – DaveX