Sql server 从具有动态列的表中获取行
我使用了SQLServerDBMS 我有一个要求,从带有动态列的表中获取行Sql server 从具有动态列的表中获取行,sql-server,tsql,Sql Server,Tsql,我使用了SQLServerDBMS 我有一个要求,从带有动态列的表中获取行 select * from TempXmlData T1 t2 t3 t4 A B C D T1、T2、T3、T4列是动态的。我通过xml配置创建它们。 当然,列名存在于另一个表中 select * from #TempA --The Result T1 T2 T3 T4 如果config有五列,则此表有五列;如果config只有一列,则此表只有一列 现在我想从这个表中获取TempXmlData的值
select * from TempXmlData
T1 t2 t3 t4
A B C D
T1、T2、T3、T4列是动态的。我通过xml配置创建它们。
当然,列名存在于另一个表中
select * from #TempA
--The Result
T1
T2
T3
T4
如果config有五列,则此表有五列;如果config只有一列,则此表只有一列
现在我想从这个表中获取TempXmlData
的值。我需要
将值放在一起,如'A','B','C','D'
。所以我需要从每一列中获取值,该列是不固定的
如果列是固定的,我可以使用这种方法来获取值
select @Value = T1(columnName) from TempXmlData
不能创建动态表定义。您唯一的选择是创建一个返回结果集的过程。在proc内部,您可以通过读取#TempA表中的行,在proc内部动态构建SQL语句。请参阅和上的MS文档。这是您正在寻找的吗 MS SQL Server 2008架构设置:
CREATE TABLE TempA
(columnName varchar(2))
;
INSERT INTO TempA
(columnName)
VALUES
('T1'),
('T2'),
('T3'),
('T4')
;
CREATE TABLE TempXmlData
(T1 varchar(1), T2 varchar(1), T3 varchar(1), T4 varchar(1))
;
INSERT INTO TempXmlData
(T1, T2, T3, T4)
VALUES
('A', 'B', 'C', 'D')
;
DECLARE @colTable table(rownum int, columnName varchar(20))
INSERT INTO @colTable SELECT row_number() over (ORDER BY columnName), columnName FROM TempA
DECLARE @query varchar(500)
DECLARE @i int, @max int
SET @i = 1
SET @max = (SELECT count(*) FROM @colTable)
SET @query = 'select '
WHILE @i <= @max
BEGIN
IF @i > 1 SET @query = @query + ','
SET @query = @query + (SELECT columnName FROM @colTable WHERE rownum = @i)
SET @i = @i + 1
END
SET @query = @query + ' from TempXmlData'
exec(@query)
| T1 | T2 | T3 | T4 |
|----|----|----|----|
| A | B | C | D |
查询1:
CREATE TABLE TempA
(columnName varchar(2))
;
INSERT INTO TempA
(columnName)
VALUES
('T1'),
('T2'),
('T3'),
('T4')
;
CREATE TABLE TempXmlData
(T1 varchar(1), T2 varchar(1), T3 varchar(1), T4 varchar(1))
;
INSERT INTO TempXmlData
(T1, T2, T3, T4)
VALUES
('A', 'B', 'C', 'D')
;
DECLARE @colTable table(rownum int, columnName varchar(20))
INSERT INTO @colTable SELECT row_number() over (ORDER BY columnName), columnName FROM TempA
DECLARE @query varchar(500)
DECLARE @i int, @max int
SET @i = 1
SET @max = (SELECT count(*) FROM @colTable)
SET @query = 'select '
WHILE @i <= @max
BEGIN
IF @i > 1 SET @query = @query + ','
SET @query = @query + (SELECT columnName FROM @colTable WHERE rownum = @i)
SET @i = @i + 1
END
SET @query = @query + ' from TempXmlData'
exec(@query)
| T1 | T2 | T3 | T4 |
|----|----|----|----|
| A | B | C | D |
为什么?你为什么这样做?业务需要,我已经完成了。
\TempA
中的列名是什么?谢谢你耐心的回答