Именование DataSet.table после выполнения запроса SQLCommand (Select)
В хранимой процедуре MS SQL Мой запрос:
SELECT *
FROM ContentReportRequests a,UserPreferences d
WHERE a.UserID = d.UserID and a.ID [email protected]
Я хочу дать таблице результатов какое-то имя.
Как я могу это сделать?
Я хочу вытащить его в ADO.Net DataSet.tables [ "NAME" ]
Ответы
Ответ 1
Я могу представить несколько вещей, которые вы можете иметь в виду.
Если вы хотите сохранить этот набор результатов, для потребления в нескольких последующих запросах вы можете искать SELECT INTO:
SELECT * into NewTableName
FROM ContentReportRequests a,UserPreferences d
WHERE a.UserID = d.UserID and a.ID [email protected]
Где NewTableName
- новое имя, и будет создана новая (постоянная) таблица. Если вы хотите, чтобы эта таблица исчезла, когда вы закончите, префиксное имя #
, чтобы сделать его временной таблицей.
В качестве альтернативы вы можете просто впитать его в один более крупный запрос, и в этом случае вы хотите сделать его подзапросом:
SELECT *
FROM (SELECT *
FROM ContentReportRequests a,UserPreferences d
WHERE a.UserID = d.UserID and a.ID [email protected]
) NewTableName
WHERE NewTableName.ColumnValue = 'abc'
или CTE:
WITH NewTableName AS (
SELECT *
FROM ContentReportRequests a,UserPreferences d
WHERE a.UserID = d.UserID and a.ID [email protected]
)
SELECT * from NewTableName
Наконец, вы можете говорить о том, чтобы вытащить результирующий набор, например. ADO.Net DataTable, и вы хотите, чтобы имя было настроено автоматически. Я не уверен, что это возможно.
Ответ 2
Вы можете использовать переменную типа table
. Подробнее здесь: Переменные таблицы в T-SQL
Ответ 3
в хранимой процедуре:
select CH.PrimaryKey, CH.Name,
NULL "CustomerHeader"
from CustomerHeader "CH";
--
select CD.PrimaryKey, CD.ShipTo,
NULL "CustomerDetail"
from CustomerDetail "CD";
--
select *, NULL "Orders"
from OrderTable;
в коде Vb.Net:
Dim ds As DataSet = Nothing
ds = SqlExecute();
Dim dtCustHeader As DataTable = Nothing
Dim dtCustDetail As DataTable = Nothing
Dim dtOrders As DataTable = Nothing
For Each dt As DataTable In ds.tables
Select Case True
Case dt.Columns.Contains("CustomerHeader")
dtCustHeader = dt
Case dt.Columns.Contains("CustomerDetail")
dtCustDetail = dt
Case dt.Columns.Contains("Orders")
dtOrders = dt
End Select
Next
Kinda SILLY (ИЛИ STUPID), который нельзя назвать таблицами в результирующем наборе.
Но это приведет вас туда без HUGE-байта, повторяющего имя таблицы в каждой строке.
Остальные накладные расходы передают значение NULL для каждой строки. Возможно, передача значения BIT будет еще меньше...
И альтернатива - всегда использовать столбец (0):
в SQL:
select NULL "CustomerDetail", CustName,Addr1,Addr2... from CustomerDetail;
в vb.net:
Dim ds As DataSet = Nothing
ds = SqlExecute();
Dim dtCustHeader As DataTable = Nothing
Dim dtCustDetail As DataTable = Nothing
Dim dtOrders As DataTable = Nothing
For Each dt As DataTable In ds.Tables
Dim tblName As String = dt.Columns(0).ColumnName
Select Case tblName.ToUpper
Case "CUSTOMERDETAIL" : dtCustHeader = dt
Case "CUSTOMERDETAIL" : dtCustDetail = dt
Case "ORDERS" : dtOrders = dt
End Select
Next
Эти методы получают ваши имена таблиц, даже если запрос возвращает нулевые строки.
но лучший для последнего... способ фактического имени таблиц в наборе данных автоматически, каждый раз, когда FROM SQL STORED PROCEDURE (с помощью вашего кода):
Dim ds As DataSet = Nothing
ds = SqlExecute();
For Each dt As DataTable In ds.Tables
dt.TableName = dt.Columns(0).ColumnName
Next
После этого вы можете получить доступ к своим таблицам с именем, которое вы контролируете в хранимой процедуре... как это должно было быть от первого дня!
EDIT: выборочная реализация:
Назовите первый столбец в шаблоне "TN: Клиент".
Ваши устаревшие хранимые процедуры работают нормально, только влияя на хранимые процедуры, которые вы хотите изменить.
For Each dt As DataTable In mo_LastDataset.Tables
Dim tblName() As String = dt.Columns(0).ColumnName.Split(":")
If tblName.Length >= 2 AndAlso tblName(0).ToUpper = "TN" Then
dt.TableName = tblName(1)
End If
Next
... david...
Ответ 4
SELECT * AS MyTableName
FROM ContentReportRequests a, UserPreferences d
WHERE a.UserID = d.UserID and a.ID [email protected]