Назначьте имена таблицам в наборе результатов SQL Server - PullRequest
6 голосов
/ 04 февраля 2011

Я пишу хранимую процедуру, которая выполняет несколько последовательных 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 ]

5 голосов
/ 04 февраля 2011

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

т.е.

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

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

3 голосов
/ 04 февраля 2011

Таблицам, возвращаемым по вашему запросу, будут присвоены имена «Таблица», «Таблица1», «Таблица2» и т. Д.

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

myAdapter.TableMappings.Add("Table", "MyTable1");
myAdapter.TableMappings.Add("Table1", "MyTable2");
myAdapter.TableMappings.Add("Table2", "MyTable3");
2 голосов
/ 08 августа 2013

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

    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
2 голосов
/ 04 февраля 2011

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

1 голос
/ 04 февраля 2011

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

select 'MyTable;MySecondTable;ThirdOrSo' as tables

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

0 голосов
/ 29 июня 2012

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

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

Было бы очень полезно, если бы вы могли просто переименовать набор результатов в SQL так же, как вы можете переименовать «Столбец AS [Custom Column]» ...

...