2017-04-19 81 views
0

我嘗試使用下面的查詢檢索存儲過程的列定義存儲過程的結果集列定義:檢索對於使用臨時表

exec sp_describe_first_result_set @tsql = N'EXEC @return_value = [dbo].[foo] 
    @DATABASENAME = dbname, 
    @TABLENAME = tblname, 
    @DATEFROM = N''20170101'', 
    @DATETO = N''20170201''' 

我也得到如下回應:

消息11526,級別16,狀態1,過程sp_describe_first_result_set,行1
元數據無法確定,因爲語句'INSERT INTO #Tables(CubeSchema,TableName,DateFilterColumn,SelectColumns)SELECT'Col1','Col2'in procedure' foo'使用te mp表

是否有解決此問題的方法?

編輯:我沒有權利查看和/或更改存儲過程,所以不幸的是這種解決方案不起作用。

+0

當你剛剛運行你的存儲過程時是否返回了一個結果集?所有列的名稱是否正確?你的程序在做什麼?如果它只是讀取數據,您可能會認爲將其更改爲內聯表值函數。我儘量避免SP,除非我想讓**做** ... – Shnugo

+0

sp返回一個始終相同(不是條件)的結果集,並且所有列都被正確命名。存儲過程由客戶端創建,爲我提供一些數據,因爲我不允許直接查詢他們的表。他們沒有提供關於列數據類型的文檔,我想看看他們。情況就是如此。 – rpd

+1

[在本文中討論了同樣的問題(使用工作示例!)](https://raresql.com/2014/01/10/sql-server-2012-fix-error-11526-the-metadata-could -not待確定 - 因爲語句-LS-在-過程-LS-用途-A-TEMP-表/)。如果你不能更改SP代碼 - 按照這一點 - 幾乎沒有燈... – Shnugo

回答

1

不改變你的存儲過程的答案是MAYBE。

您正在使用的選項('sp_describe_first_result_set')不適用於臨時表,因爲您正在使用INSERT語句。 如果要將INSERT語句更改爲SELECT INTO語句,它可能適用於將數據存儲到臨時表中,但由於該數據不可用,因此仍不會將數據從中取出。我不確定'sp_describe_first_result_set'的內部結構,但它看起來像是使用SET FMTONLY ON選項,因爲臨時表會失敗。

因此,如果您想避免這種情況,請更改存儲過程以使用表變量而不是臨時表(@table vs #table)。

如果您不侷限於SQL Server,並且您可以使用編程語言(例如.Net使用ADO.Net)編程,您可以使用ExecuteReader結果的GetSchemaTable方法,就像這樣:

var reader = sqlCommand.ExecuteReader(); 
var schemaTable = reader.GetSchemaTable(); 

希望它有幫助!