2013-10-23 37 views
0

在此查詢:檢查存儲過程返回只有一列,一行

DECLARE @TempPerformance TABLE(FeatureTitle VARCHAR(50), FeatureText VARCHAR(50)) 

INSERT INTO @TempPerformance 
EXEC [usp_GetPerfomance] @Value 

它一些時間給2列,有時一列only..It不工作,當它返回只有1列臨時表不是這樣設計的..

如何區分這兩個結果。

編輯

如果fails..it返回一列中的SP - 一排爲:

Standard 
-------- 
No Records Found 
+2

您需要更改存儲的過程,使每一個可能的結果集,它產生具有相同的「形」爲您在您的臨時表中的列號 - 相同數量的列,每個列的類型相同,理想情況下這些列的名稱相同(對於大多數情況,列名比位置更重要,但這是少數實際上不是要求的地方之一)。 –

+0

usp_GetPerformance的代碼是相關的,但您沒有提供。 –

+0

由於我無法改變SP ...因爲很多依賴關係都存在..所以我不知道它是相關的.. – James

回答

0

您可以使用OPENROWSET執行查詢並得到結果的表。然後,您可以使用該表格來驗證您是否應該以某種方式處理它。

如果你去的聯繫,並期待在部分:

SELECT a.* 
FROM OPENROWSET('SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;', 
    'SELECT GroupName, Name, DepartmentID 
     FROM AdventureWorks.HumanResources.Department 
     ORDER BY GroupName, Name') AS a; 

,那麼你可以使用EXEC yourDatabase.Schema.Procedure代替SELECT。

但是,它要求您將reconfigure服務器指定爲Ad Hoc Queries,並且您可能沒有適當的權利來執行此操作。 這通常不是生產環境的可靠解決方案,所以我不會親自推薦該方法。

1

有一種方法。使用OPENROWSET可以將存儲過程的結果存入動態創建的(臨時)表中。 More about it in this question可能存在安全問題和登錄問題。

之後,您可以輕鬆地使用sys.columns

SELECT * INTO #MyTempTable FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;', 
     '[usp_GetPerfomance] ' + CAST(@Value AS VARCHAR(MAX))); 

SELECT COUNT(*) FROM tempdb.sys.columns WHERE object_id=object_id('tempdb..#MyTempTable');