Создайте динамику c SQL на основе имен столбцов, переданных через строку - PullRequest
0 голосов
/ 03 августа 2020

Мне нужно найти строки, которые присутствуют в таблице A и отсутствуют в таблице B (с использованием LEFT JOIN), где таблица A и таблица B - это две таблицы с одинаковой структурой, но в другой схеме. Но запрос должен быть построен с использованием Dynami c SQL, а столбцы, которые необходимо использовать для выполнения JOIN, хранятся в строке. Как извлечь имена столбцов из строки и использовать их для динамического построения следующего запроса:

База данных Azure SQL Сервер

например:

DECLARE @ColNames NVARCHAR(150) = 'col1,col2'

Запрос должен быть построен на основе столбцов, определенных в ColNames: -

SELECT *
FROM Table A
Left Join
Table B
ON A.col1 = B.col1
AND A.col2 = B.col2
AND B.col1 IS NULL AND B.col2 IS NULL

Если количество столбцов в @ColNames больше, тогда оператор SELECT должен обслуживать все столбцы.

1 Ответ

1 голос
/ 03 августа 2020

Не зная полного контекста, попробуйте следующее:

DECLARE @ColNames NVARCHAR(150) = 'col1,col2'
DECLARE @JoinContion NVARCHAR(MAX) = ''
DECLARE @WhereCondition NVARCHAR(MAX) = ''

SELECT @JoinContion += CONCAT('[a].', QUOTENAME(Value), ' = ', '[b].', QUOTENAME(Value), (CASE WHEN LEAD(Value) OVER(ORDER BY Value) IS NOT NULL THEN ' AND ' ELSE '' END))
    ,@WhereCondition += CONCAT('[a].', QUOTENAME(Value), ' IS NULL', (CASE WHEN LEAD(Value) OVER(ORDER BY Value) IS NOT NULL THEN ' AND ' ELSE '' END))
FROM STRING_SPLIT(@ColNames,N',')

SELECT @JoinContion, @WhereCondition
  • String_Split : разделить входную строку на столбцы
  • Lead : чтобы определить, нужно ли нам ключевое слово AND, если это не последняя строка.

Имейте в виду, что NOT EXISTS, вероятно, лучшее решение, чем LEFT JOIN

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