Назначение имен таблицам в результирующем наборе SQL Server

Я пишу хранимую процедуру, которая выполняет несколько последовательных SELECT заявления. Когда я выполнить эту процедуру через ADO.NET я намерен закончить с DataSet содержащий несколько DataTable объекты. Это ведет себя так, как ожидалось.

в настоящее время я полагаюсь на порядок таблиц в 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 операторы и всегда доступ к нужной таблице по ее индексу?

6 ответов


Я не пробовал это, но не могли бы вы изменить структуру сохраненного proc, чтобы у вас был запрос, возвращающий имя таблицы перед каждым запросом данных?

то есть

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

затем создайте набор данных вручную, создав таблицы и добавив их?


таблицам, возвращаемым вашим запросом, будут даны имена "таблица", "Table1", "Table2" и т. д.

вы можете добавить TableMappings в DataAdapter перед заполнением набора данных, чтобы сопоставить их с именами таблиц:

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

к сожалению, я не верю, что это возможно! У меня есть аналогичная настройка, которая получает наборы данных из хранимых процедур, и после просмотра я сдался и прибегнул к индексам.


Это также не лучшее решение, но вы можете сделать первый столбец в своем запросе именем таблицы:

    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

это невозможно, но его SQL "ошибка", а не ошибка DataAdapter/Set, потому что результирующий набор не несет имя запрашиваемой таблицы (и это не заметно, если вы используете внутреннее соединение), и у адаптера таблицы нет запроса, из которого можно выбрать имя. Один из методов, который вы можете использовать, - сначала вернуть список таблиц в качестве запроса#0 в процедуре, например

select 'MyTable;MySecondTable;ThirdOrSo' as tables

последовали и все остальные запросы, то читайте индексом 0 таблиц и этой области, сплит/дляпеременная элемента переименовать другие таблицы в наборе данных. Сопровождающий все равно должен знать механизм, но, по крайней мере, это дает ему некоторую свободу для реорганизации..


Я тоже думал об этом, и единственное решение, которое я могу придумать, - это создать временные таблицы в рамках процедуры и заполнить результаты там (называя таблицы, как вы идете).

Я еще не пробовал это, потому что это не похоже на правильный способ сделать это с тем, чтобы получить результаты дважды (запрос во временную таблицу, запрос временной таблицы).

было бы очень полезно, если бы вы могли просто переименовать свой результирующий набор в SQL так же, как вы можете переименуйте " столбец как [пользовательский столбец]"...