Заполнить набор данных именами таблиц из хранимой процедуры - PullRequest
5 голосов
/ 19 января 2012

У меня есть хранимая процедура, которая возвращает несколько таблиц.

Он правильно заполняет мой набор данных, но называет мои таблицы [Table, Table1, Table2, ...].

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

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Ваш SP на самом деле не возвращает несколько таблиц, он возвращает выбор столбцов и строк из ваших таблиц, поэтому нет «имени таблицы» и, следовательно, почему они называются table1, table2 и т. Д. Если это важно, вы могли бы вернуть дополнительный столбец для каждого выбора, и в этом столбце заполните его желаемым именем, а затем используйте его оттуда.

т.е.

   select *,'MyTableName1' As [TableName] name from mytablename1
   select *,'MyTableName2' As [TableName] name from mytablename2
0 голосов
/ 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 ...

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