powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получение имен полей из запроса
20 сообщений из 20, страница 1 из 1
Получение имен полей из запроса
    #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
Получение имен полей из запроса
    #39651770
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select * - зло

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

Где получить?
...
Рейтинг: 0 / 0
Получение имен полей из запроса
    #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
Получение имен полей из запроса
    #39651801
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesэто ... плохая идея
+1
...
Рейтинг: 0 / 0
Получение имен полей из запроса
    #39651843
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesобычно за такие запросы типа: SELECT * FROM T у нас принято отправлять на доработку :)
это очень плохая идея, особенно если в запросе много JOIN'ов, а 90% полей нафиг ненадо. Это может сильно замедлить запрос и в случае добавления полей поломать логику
И особенно, если у соединяемых таблиц есть поля с одинаковыми именами. Метаданные выборки (имена полей, их типы) получить несложно, если возврат метаданных поддерживается провайдером: DataTableReader.GetSchemaTable (если не поддерживается, вернется null), но вот какое поле результирующего набора относится к какой из соединяемых таблиц, не получить никак.
...
Рейтинг: 0 / 0
Получение имен полей из запроса
    #39651844
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныМетаданные выборки (имена полей, их типы) получить несложно

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

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

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

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

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

Зависит от провайдера, как он на это отреагирует. Может и колонки с повторяющимися именами засунуть.
...
Рейтинг: 0 / 0
Получение имен полей из запроса
    #39651919
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Microsoft® SQL Server Transact-SQL ScriptDom
Копать нужно в этом направлении, но лучше не копать
...
Рейтинг: 0 / 0
Получение имен полей из запроса
    #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
Получение имен полей из запроса
    #39651934
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и с чего вы решили, что у ТС MS SQL Server?
...
Рейтинг: 0 / 0
Получение имен полей из запроса
    #39651942
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneну и с чего вы решили, что у ТС MS SQL Server?
Какая разница... постановка была "Имя_Таблицы.Имя_Поля" и селект со звездой...
...
Рейтинг: 0 / 0
Получение имен полей из запроса
    #39651956
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserKonst_Oneну и с чего вы решили, что у ТС MS SQL Server?
Какая разница... постановка была "Имя_Таблицы.Имя_Поля" и селект со звездой...
Имя таблицы в пролете.
Теоретически можно распарсить запрос, получить имена таблиц, последовательно вытащить из словарных таблиц базы имена колонок, и исходя из того, что при select * сначала выводятся колонки первой таблицы, потом второй, итд. в порядке расположения колонок таблицы, сформировать алиасы. Но вот что делать, если один из участников джойна - CTE или подзапрос? Учитывая, что тип БД не указан, можно вспомнить про тот же оракл, где джойны могут быть написаны в ансишном стиле, а могут в родном оракловом (имена таблиц через запятую во from, все предикаты соединений в секции where). В общем, чем решать задачу, тянущую на написание полноценного парсера SQL, лучше немного потрудиться пальцами, и по-человечески сформировать список выбираемых полей. Это намного, на 10 порядков проще.
...
Рейтинг: 0 / 0
Получение имен полей из запроса
    #39651964
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловнылучше немного потрудиться пальцамиЕсли MSSQL - можно даже не трудиться. Студия в редакторе запросов мне автоматически SELECT * заменила на имена полей для всех входящих в него таблиц
...
Рейтинг: 0 / 0
Получение имен полей из запроса
    #39651978
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныТеоретически можно распарсить запрос, получить имена таблиц, последовательно вытащить из словарных таблиц базы имена колонок

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

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


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