Объединить результаты динамического `sp_executesql` по идентификатору строки - PullRequest
0 голосов
/ 24 июня 2019

Я хотел бы объединить результаты динамического разворота с другой таблицей (основываясь на моем Q по этому вопросу).Имена столбцов являются динамическими, поэтому заранее не известны, и результат не может быть прочитан в табличную переменную или что-то подобное.

Например, сводная таблица может привести к такому результату:

EXEC sp_executesql @Query -- INTO @Result

ID | R1 | R2
---+----+----
 1 | 50 |  3
 2 |  9 |  7
 3 | 38 | 21

Что я хотел бы объединить с другими столбцами данных:

SELECT *
FROM @Result r
JOIN Table t
ON r.ID = t.ID

ID | R1 | R2 | T1
---+----+----+----
 1 | 50 |  3 | 40
 2 |  9 |  7 |  1
 3 | 38 | 21 | 12

Возможны ли подобные запросы даже с SQL Server?Справедливости ради, имена столбцов не являются полностью неизвестными, они передаются динамическому запросу в списке, подобном [R1],[R2]...


Вот кое-что, с чем можно поиграть.Это приводит к двум примерным наборам результатов отдельно.

DECLARE @Columns nvarchar(MAX) = '[R1],[R2]';
DECLARE @Query nvarchar(MAX);
SET @Query = N'SELECT * FROM (VALUES (1, 50, 3), (2, 9, 7), (3, 38, 21)) AS X(ID, R1, R2)';

DECLARE @Table table (ID int unique not null, T1 int null)
INSERT INTO @Table (ID, T1) VALUES
(1, 40), (2, 1), (3, 12);

SELECT @Columns;
EXEC sp_executesql @Query;
SELECT * FROM @Table;

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Полное перемещение запроса в динамический SQL привело к хорошему решению.Используя подпрограмму, подобную приведенной ниже, или аналогичную, однако можно определить таблицу, которая будет использоваться в объединении, затем можно передать имена столбцов.

DECLARE @Columns nvarchar(MAX) = '[R1],[R2]';
DECLARE @Query nvarchar(MAX);

SET @Query = N'
DECLARE @Table table (ID int unique not null, T1 int null)
INSERT INTO @Table (ID, T1) VALUES
(1, 40), (2, 1), (3, 12);

SELECT X.ID, t.T1, ' + @Columns + '
FROM (VALUES (1, 50, 3), (2, 9, 7), (3, 38, 21)) AS X(ID, R1, R2)
JOIN @Table t
ON t.ID = X.ID
';

EXEC sp_executesql @Query;
0 голосов
/ 24 июня 2019

Вставьте результат вашего запроса sp_executesql во временную таблицу и затем присоедините его.

EXEC sp_executesql N'SELECT * INTO ##tmp FROM MyTable'

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