Именование 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, и вы хотите, чтобы имя было настроено автоматически. Я не уверен, что это возможно.

Ответ 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]