powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возможно ли вывести все таблицы из JOIN'ов
10 сообщений из 10, страница 1 из 1
Возможно ли вывести все таблицы из JOIN'ов
    #39975096
Earl11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток. Интересует вопрос такой:
имеется много join'ов
Код: sql
1.
2.
3.
4.
5.
6.
SELECT  FROM t1
LEFT JOIN t2 ON t1.id = t2.id
RIGHT JOIN t3 ON t1.id = t3.id
LEFT JOIN t4 ON t2.id = t4.id
INNER JOIN t5 ON t3.id = t5.id
LEFT JOIN .....


возможно ли реализовать/вывести дерево/список всех таблиц, которые используются в запросе?
...
Рейтинг: 0 / 0
Возможно ли вывести все таблицы из JOIN'ов
    #39975120
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В смысле отпарсить текст запроса?
...
Рейтинг: 0 / 0
Возможно ли вывести все таблицы из JOIN'ов
    #39975169
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвозможно ли реализовать/вывести дерево/список всех таблиц, которые используются в запросе? С учетом используемых вью и функций ? Если да, то довольно сложно.

Сначала надо распарсить все секции ФРОМ (их может быть много). Найти в них вью и рекурсивно распарсить вью.

Потом найти функции...Впрочем даже без функций вышеприведенное - не очень простая задача.
...
Рейтинг: 0 / 0
Возможно ли вывести все таблицы из JOIN'ов
    #39975176
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать достать их из плана. Как-то так (с ходу так и не придумал, как сохранить результат после set showplan_xml on, чтобы разобрать его на сервере):
Код: c#
1.
2.
3.
4.
5.
6.
7.
class OrdinalIgnoreCaseEqualityComparer: IEqualityComparer<string>
{
  public bool Equals(string x, string y)
    => x?.Equals(y, StringComparison.OrdinalIgnoreCase) ?? false;
  public int GetHashCode(string obj)
    => obj.ToLowerInvariant().GetHashCode();
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
var xd = new XmlDocument();
using(var cnn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks;Integrated Security=True"))
{
  cnn.Open();
  using (var cmd = new SqlCommand("set showplan_xml on", cnn))
    cmd.ExecuteNonQuery();
  using(var cmd = new SqlCommand(@"
select d.Name, e.LoginID, e.JobTitle, h.StartDate
from HumanResources.Department d
join HumanResources.EmployeeDepartmentHistory h on h.DepartmentId=d.DepartmentId and h.EndDate is null
join HumanResources.Employee e on e.BusinessEntityID=h.BusinessEntityID", cnn))
  using (var reader = cmd.ExecuteReader())
  {
    reader.Read();
    xd.LoadXml(reader.GetString(0));
  }
  using (var cmd = new SqlCommand("set showplan_xml off", cnn))
    cmd.ExecuteNonQuery();
}
xd.SelectNodes("//*[@Database and @Schema and @Table]")
  ?.Cast<XmlElement>()
  .Select(e => $"{e.GetAttribute("Database")}.{e.GetAttribute("Schema")}.{e.GetAttribute("Table")}")
  .Distinct(new OrdinalIgnoreCaseEqualityComparer())
  .ToList()
  .ForEach(Console.WriteLine);


Вывод:

Код: plaintext
1.
2.
[AdventureWorks].[HumanResources].[Department]
[AdventureWorks].[HumanResources].[EmployeeDepartmentHistory]
[AdventureWorks].[HumanResources].[Employee]
...
Рейтинг: 0 / 0
Возможно ли вывести все таблицы из JOIN'ов
    #39975180
tunknown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Earl11
возможно ли реализовать/вывести дерево/список всех таблиц, которые используются в запросе?
Возможно, использование RegEx даст какой-то результат. Или не даст.

Сначала проверить возможности RegEx . Потом попробовать VBScript.RegExp . Если результат на первом шаге будет лучше, чем на втором, то попробовать через CLR.

Какая задача? Зачем это нужно? Или проще проджоинить текст запроса со всеми подходящими названиями объектов из sysobjects через like?
...
Рейтинг: 0 / 0
Возможно ли вывести все таблицы из JOIN'ов
    #39975188
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tunknown
Или не даст.

Не даст. Контекстно-зависимая грамматика не парсится регэкспами.
...
Рейтинг: 0 / 0
Возможно ли вывести все таблицы из JOIN'ов
    #39975195
Earl11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tunknown, задача - "упростить" жизнь) есть запросы с кучей подобных джоинов, приходится разбирать всё по порядку, каждый джоин. Зачем?) Нужно добавлять различные измерения в запросы, а чтобы понять откуда, надо понять как и куда)
...
Рейтинг: 0 / 0
Возможно ли вывести все таблицы из JOIN'ов
    #39975296
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Earl11,

если в запросах такая простая структура, то можете открыть запрос в построителе. Увидите в графическом виде. Это в SSMS правой кнопкой.
...
Рейтинг: 0 / 0
Возможно ли вывести все таблицы из JOIN'ов
    #39976711
Сруль.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделайте вью, а потом

sp_depends 'view name'

Получите список всего, что там занято.
...
Рейтинг: 0 / 0
Возможно ли вывести все таблицы из JOIN'ов
    #39976743
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сруль.
...
Получите список всего, что там занято.
Список первого уровня. По хорошему его тоже надо разобрать.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возможно ли вывести все таблицы из JOIN'ов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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