Назначение имен таблицам в результирующем наборе 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 так же, как вы можете переименуйте " столбец как [пользовательский столбец]"...