Дайте имя таблице после выбора - PullRequest
12 голосов
/ 21 апреля 2011

В хранимой процедуре MS SQL Мой запрос:

SELECT *  
FROM ContentReportRequests a,UserPreferences d
WHERE  a.UserID = d.UserID and a.ID =@ID

Я хочу дать таблице результатов какое-нибудь имя. Как я могу это сделать?

Я хочу перенести его в ADO.Net DataSet.tables ["NAME"]

Ответы [ 4 ]

35 голосов
/ 21 апреля 2011

Я могу представить себе несколько вещей, которые вы, возможно, имели в виду.

Если вы хотите сохранить этот набор результатов, для использования в нескольких последующих запросах вы можете искать SELECT INTO:

SELECT * into NewTableName
FROM ContentReportRequests a,UserPreferences d
WHERE  a.UserID = d.UserID and a.ID =@ID

Где NewTableName - новое имя, и будет создана новая (постоянная) таблица.Если вы хотите, чтобы эта таблица исчезла, когда вы закончите, добавьте к ее имени префикс #, чтобы сделать его временной таблицей.

В качестве альтернативы, вы можете просто захотеть объединить ее в один большийзапрос, в этом случае вы бы хотели сделать его подвыбором:

SELECT *
FROM (SELECT *  
FROM ContentReportRequests a,UserPreferences d
WHERE  a.UserID = d.UserID and a.ID =@ID
) NewTableName
WHERE NewTableName.ColumnValue = 'abc'

или CTE:

WITH NewTableName AS (
    SELECT *  
    FROM ContentReportRequests a,UserPreferences d
    WHERE  a.UserID = d.UserID and a.ID =@ID
)
SELECT * from NewTableName

Наконец, вы можете говорить о переносе набора результатов внапример, ADO.Net DataTable, и вы хотите, чтобы имя было установлено автоматически.Я не уверен, что это возможно.

2 голосов
/ 21 апреля 2011

Вы можете использовать переменную типа table.Подробнее здесь: Табличные переменные в T-SQL

1 голос
/ 20 апреля 2017

в хранимой процедуре:

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

Какая глупость (или глупость), которую нельзя назвать таблицами в наборе результатов.Но это приводит вас к отсутствию ОГРОМНОГО числа байтов, повторяющего имя таблицы в каждой строке.

По-прежнему накладные расходы передают значение NULL обратно для каждой строки.Возможно, передача значения BIT будет еще меньше ...

И альтернативой является всегда использовать column (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

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

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

Dim ds As DataSet = Nothing
ds = SqlExecute();
For Each dt As DataTable In ds.Tables
    dt.TableName = dt.Columns(0).ColumnName
Next

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

РЕДАКТИРОВАТЬ : выборочная реализация: назовите первый столбец в шаблоне "TN: Customer".Ваши устаревшие хранимые процедуры работают нормально, влияя только на хранимые процедуры, которые вы хотите изменить.

            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 ...

0 голосов
/ 21 апреля 2011
SELECT * AS MyTableName  
  FROM ContentReportRequests a, UserPreferences d  
 WHERE a.UserID = d.UserID and a.ID =@ID  
...