2011-02-04 44 views
6

我在寫一個存儲過程,該存儲過程執行多個連續的SELECT語句。當我通過ADO.NET執行此過程時,我的意圖是以包含若干DataTable對象的DataSet結束。這表現如預期。爲SQL Server結果集中的表分配名稱

我目前依靠DataSet中的表的順序來匹配存儲過程中的SELECT語句的順序,但是在此順序中確實沒有任何意義。最終必須維護程序的人不必知道結果的預期順序,維護申請的人員也不必知道程序中陳述的順序。

我想知道的是,是否可以在存儲過程本身中爲每個SELECT語句的結果指定名稱,然後通過ADO.NET(希望無縫地)通過這些名稱來訪問,以便我可以訪問每個表的名稱而不是其順序?

例如

// populate DataSet with results from stored proc 
DataSet ds = new DataSet(); 
dataAdapter.Fill(ds); 

// now access one of the resulting DataTable via name 
return ds.Tables["NamedResultFromTheProc"]; 

那麼,有什麼辦法可以達到這個目的嗎?或者我將不得不依賴SELECT聲明的順序,並始終按索引訪問所需的表?

回答

5

我還沒有試過,但讓你有你能不能改變存儲過程的結構一個查詢在每次數據查詢之前返回表的名稱?

select 'TableName' 
select * from Table where 1 = 1 

然後通過創建表和將它們添加手動構建數據集?

2

不幸的是,我不相信這是可能的!我有一個類似的設置,它從存儲過程中獲取數據集,然後看着我放棄並使用索引。

1

這是不可能的,但它的SQL「錯誤」,而不是DataAdapter/Set的錯誤,因爲結果集不包含查詢表的名稱(如果使用內部連接,這也不是明顯可能的),也不是表適配器有一個從中選擇名稱的查詢。 您可以使用的一種方法是首先在過程中返回一列表作爲查詢#0,例如

select 'MyTable;MySecondTable;ThirdOrSo' as tables 

其次是所有其他查詢,然後讀取索引0表和該字段,split/forloop重命名數據集中的其他表。維護人員仍然需要知道機制,但至少它給了他一些自由重組。

+0

謝謝;你的建議在一定程度上有所幫助,雖然它不是理想的。至少這將負責處理與數據庫的任何錯誤,而不是客戶端應用程序。 – 2011-02-04 10:41:05

3

您的查詢返回的表格將被命名爲「表格」,「表格1」,「表格2」等。

您可以填充DataSet中把它們映射到你的表名前添加使用TableMappings到您的DataAdapter:

myAdapter.TableMappings.Add("Table", "MyTable1"); 
myAdapter.TableMappings.Add("Table1", "MyTable2"); 
myAdapter.TableMappings.Add("Table2", "MyTable3"); 
+2

這並沒有解決後期的初始問題,程序維護人員不用擔心查詢順序的能力。 – mmix 2011-02-04 10:12:57

+0

它並沒有給出他要求的確切內容:他仍然需要編寫自己的SP以特定的順序返回結果集(在我看來,這是一個合理的限制)。但之後他可以通過名稱而不是索引訪問結果數據集中的表,並限制結果返回到填充DataSet的DAL類的順序的知識。 – Joe 2011-02-04 11:12:47

0

我一直在想這個問題,我能想到的唯一解決方案是在過程中創建臨時表並將結果填充到那裏(隨時爲表命名)。

我還沒有嘗試過,因爲它不覺得正確的方法來做兩次(查詢到臨時表,查詢臨時表)。

,如果你可以只重命名結果在SQL中,你可以重命名以同樣的方式「列[自定義列]」設置這將是非常有用的...

2

這也不是最好的解決辦法,但您可以使查詢中的第一列爲表名:

Select 'Customer', CustomerID, CustomerName, CustomerAddress 
    From Customer 
    Where CustomerID = @CustomerID 

    Select 'Orders', OrderID, OrderPrice, OrderDate 
    From Order O 
    Join Customer C on C.CustomerID = O.CustomerID 
    Where C.CustomerID = @CustomerID 

    Select 'OrderItems', ItemID, ItemDescription, ItemPrice 
    From OrderItems I 
    Join Order O on O.OrderID = I.OrderID 
    Join Customer C on C.CustomerID = O.CustomerID 
    Where C.CustomerID = @CustomerID