Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возможно ли вывести все таблицы из JOIN'ов / 10 сообщений из 10, страница 1 из 1
01.07.2020, 23:33
    #39975096
Earl11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли вывести все таблицы из JOIN'ов
Доброго времени суток. Интересует вопрос такой:
имеется много 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
02.07.2020, 02:30
    #39975120
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли вывести все таблицы из JOIN'ов
В смысле отпарсить текст запроса?
...
Рейтинг: 0 / 0
02.07.2020, 09:07
    #39975169
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли вывести все таблицы из JOIN'ов
авторвозможно ли реализовать/вывести дерево/список всех таблиц, которые используются в запросе? С учетом используемых вью и функций ? Если да, то довольно сложно.

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

Потом найти функции...Впрочем даже без функций вышеприведенное - не очень простая задача.
...
Рейтинг: 0 / 0
02.07.2020, 09:21
    #39975176
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли вывести все таблицы из JOIN'ов
Можно попробовать достать их из плана. Как-то так (с ходу так и не придумал, как сохранить результат после 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
02.07.2020, 09:27
    #39975180
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли вывести все таблицы из JOIN'ов
Earl11
возможно ли реализовать/вывести дерево/список всех таблиц, которые используются в запросе?
Возможно, использование RegEx даст какой-то результат. Или не даст.

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

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

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

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

sp_depends 'view name'

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


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