Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получение имен полей из запроса / 20 сообщений из 20, страница 1 из 1
29.05.2018, 13:35
    #39651752
Mixon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
День добрый!
Подскажите есть ли способ получить имена полей типа Имя_Таблицы.Имя_Поля
для запросов типа:

Select * from T

и

Select * from T as t
Left Join T2 as t2 ON t2.id=t.id_T2
...
Left Join TN as tn ON tn.id=tk.id_T2
...
Рейтинг: 0 / 0
29.05.2018, 13:51
    #39651770
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
select * - зло

Выбирай нужные поля и назначай им необходимые псевдонимы
...
Рейтинг: 0 / 0
29.05.2018, 14:07
    #39651789
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
Mixon,

Где получить?
...
Рейтинг: 0 / 0
29.05.2018, 14:14
    #39651796
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
MixonДень добрый!
Подскажите есть ли способ получить имена полей типа Имя_Таблицы.Имя_Поля
для запросов типа:

Select * from T

и

Select * from T as t
Left Join T2 as t2 ON t2.id=t.id_T2
...
Left Join TN as tn ON tn.id=tk.id_T2
обычно за такие запросы типа: SELECT * FROM T у нас принято отправлять на доработку :)
это очень плохая идея, особенно если в запросе много JOIN'ов, а 90% полей нафиг ненадо. Это может сильно замедлить запрос и в случае добавления полей поломать логику
...
Рейтинг: 0 / 0
29.05.2018, 14:25
    #39651801
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
Roman Mejtesэто ... плохая идея
+1
...
Рейтинг: 0 / 0
29.05.2018, 15:20
    #39651843
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
Roman Mejtesобычно за такие запросы типа: SELECT * FROM T у нас принято отправлять на доработку :)
это очень плохая идея, особенно если в запросе много JOIN'ов, а 90% полей нафиг ненадо. Это может сильно замедлить запрос и в случае добавления полей поломать логику
И особенно, если у соединяемых таблиц есть поля с одинаковыми именами. Метаданные выборки (имена полей, их типы) получить несложно, если возврат метаданных поддерживается провайдером: DataTableReader.GetSchemaTable (если не поддерживается, вернется null), но вот какое поле результирующего набора относится к какой из соединяемых таблиц, не получить никак.
...
Рейтинг: 0 / 0
29.05.2018, 15:22
    #39651844
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
Сон Веры ПавловныМетаданные выборки (имена полей, их типы) получить несложно

Соглашусь с тем, что за select * надо бить, но вот это не правда :)

Сон Веры Павловныно вот какое поле результирующего набора относится к какой из соединяемых таблиц, не получить никак.

Парсится первая строка результата запроса и получаем имена полей.
...
Рейтинг: 0 / 0
29.05.2018, 15:23
    #39651845
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
hVosttСон Веры ПавловныМетаданные выборки (имена полей, их типы) получить несложно

Соглашусь с тем, что за select * надо бить, но вот это не правда :)

Тьфу блин, прочитал «невозможно»... вот чукча.
...
Рейтинг: 0 / 0
29.05.2018, 15:28
    #39651849
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
hVosttПарсится первая строка результата запроса и получаем имена полей.
А если в селект-листе коррелированные подзапросы?
...
Рейтинг: 0 / 0
29.05.2018, 15:39
    #39651861
Mixon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
Понимаю всеобщее негодование, всем спасибо.
...
Рейтинг: 0 / 0
29.05.2018, 15:42
    #39651866
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
Сон Веры ПавловныhVosttПарсится первая строка результата запроса и получаем имена полей.
А если в селект-листе коррелированные подзапросы?

Зависит от провайдера, как он на это отреагирует. Может и колонки с повторяющимися именами засунуть.
...
Рейтинг: 0 / 0
29.05.2018, 16:33
    #39651919
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
Microsoft® SQL Server Transact-SQL ScriptDom
Копать нужно в этом направлении, но лучше не копать
...
Рейтинг: 0 / 0
29.05.2018, 16:34
    #39651920
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var selectQuery = "Some sql query";
using (var sqlConn = new SqlConnection("ConnectionString"))
{
    var sqlCmd = new SqlCommand(selectQuery , sqlConn);
    var sqlAdapter = new SqlDataAdapter(sqlCmd);
    var table = new DataTable();
    sqlAdapter.Fill(table);
    //table.Columns - коллекция столбцов
}
...
Рейтинг: 0 / 0
29.05.2018, 16:51
    #39651934
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
ну и с чего вы решили, что у ТС MS SQL Server?
...
Рейтинг: 0 / 0
29.05.2018, 16:59
    #39651942
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
Konst_Oneну и с чего вы решили, что у ТС MS SQL Server?
Какая разница... постановка была "Имя_Таблицы.Имя_Поля" и селект со звездой...
...
Рейтинг: 0 / 0
29.05.2018, 17:15
    #39651956
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
buserKonst_Oneну и с чего вы решили, что у ТС MS SQL Server?
Какая разница... постановка была "Имя_Таблицы.Имя_Поля" и селект со звездой...
Имя таблицы в пролете.
Теоретически можно распарсить запрос, получить имена таблиц, последовательно вытащить из словарных таблиц базы имена колонок, и исходя из того, что при select * сначала выводятся колонки первой таблицы, потом второй, итд. в порядке расположения колонок таблицы, сформировать алиасы. Но вот что делать, если один из участников джойна - CTE или подзапрос? Учитывая, что тип БД не указан, можно вспомнить про тот же оракл, где джойны могут быть написаны в ансишном стиле, а могут в родном оракловом (имена таблиц через запятую во from, все предикаты соединений в секции where). В общем, чем решать задачу, тянущую на написание полноценного парсера SQL, лучше немного потрудиться пальцами, и по-человечески сформировать список выбираемых полей. Это намного, на 10 порядков проще.
...
Рейтинг: 0 / 0
29.05.2018, 17:34
    #39651964
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
Сон Веры Павловнылучше немного потрудиться пальцамиЕсли MSSQL - можно даже не трудиться. Студия в редакторе запросов мне автоматически SELECT * заменила на имена полей для всех входящих в него таблиц
...
Рейтинг: 0 / 0
29.05.2018, 18:01
    #39651978
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
Сон Веры ПавловныТеоретически можно распарсить запрос, получить имена таблиц, последовательно вытащить из словарных таблиц базы имена колонок

Да не надо этого делать. Выполняешь любой запрос, потом смотришь на результат, который вернулся. Посмотри на исходники Dapper-а, который абсолютно любой запрос может вернуть как dynamic (внутри там будет IDictionary<string, object>), и никакая схема ему не нужна.
...
Рейтинг: 0 / 0
30.05.2018, 07:16
    #39652172
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
hVosttСон Веры ПавловныТеоретически можно распарсить запрос, получить имена таблиц, последовательно вытащить из словарных таблиц базы имена колонок

Да не надо этого делать. Выполняешь любой запрос, потом смотришь на результат, который вернулся. Посмотри на исходники Dapper-а, который абсолютно любой запрос может вернуть как dynamic (внутри там будет IDictionary<string, object>), и никакая схема ему не нужна.
А к какой таблице какие колонки относятся - откуда взять? У ТС в постановке задачи было
Mixonполучить имена полей типа Имя_Таблицы.Имя_Поля
А просто получить имена полей выборки - да, дело нехитрое, и способов для этого существует больше одного.
Ну, и в случае наличия в разных соединяемых таблицах полей с одинаковыми именами будет весело (см. скриншот ниже). Если бы их не было, то к дапперовскому dynamic-результату можно было бы обращаться как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
using (var cnn = new SqlConnection("Data Source=.;Initial Catalog=stuff;Integrated Security=True"))
{
  cnn.Open();
  var data = cnn.Query(@"
    select 1 n, 'A' s
    union all
    select 2, 'B'");
  foreach (var row in data)
    Console.WriteLine("{0}: {1}", row.n, row.s);
}


а в случае колонок с одинаковыми именами - только вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
create table dbo.Test (
  n int,
  s varchar(1)
)
go
insert into dbo.Test(n,s) values(1, 'A')
go


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
using (var cnn = new SqlConnection("Data Source=.;Initial Catalog=stuff;Integrated Security=True"))
{
  cnn.Open();
  var data = cnn.Query(@"
  select *
  from dbo.Test t1
  join dbo.Test t2 on t2.n=t1.n
  join dbo.Test t3 on t3.n=t2.n
  join dbo.Test t4 on t4.n=t3.n
");
  foreach (var row in data)
  foreach(var kvp in row)
    Console.WriteLine("{0}: {1}", kvp.Key, kvp.Value);
}


- не позавидую тому, кому придется работать с такой кашей.
В общем, явное перечисление выбираемых полей в селект-листе, и назначение алиасов для полей выборки с одинаковыми именами так, чтобы имя каждого поля в выборке было уникальным - залок отсутствия головной (и не только) боли в будущем.
...
Рейтинг: 0 / 0
30.05.2018, 10:50
    #39652300
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение имен полей из запроса
Сон Веры ПавловныВ общем, явное перечисление выбираемых полей в селект-листе, и назначение алиасов для полей выборки с одинаковыми именами так, чтобы имя каждого поля в выборке было уникальным - залок отсутствия головной (и не только) боли в будущем.

Да, за звездочку в запросах лупашить подвернувшимся айпадом
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получение имен полей из запроса / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]