通过行ID

时间:2019-06-24 12:46:02

标签: sql sql-server

我想将动态数据透视表的结果添加到另一个表中(以我的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 :(得分:0)

将sp_executesql查询的结果插入到临时表中,然后将其加入。

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

SELECT * FROM ##tmp

答案 1 :(得分:0)

将查询完全移动到动态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;