0

我使用 SQL Server DBMS

我有一个要求,从具有动态列的表中获取行

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
4

2 回答 2

0

您不能创建动态表定义。您唯一的选择是创建一个返回结果集的过程。在 proc 内部,您可以通过读取 #TempA 表中的行来在 proc 内部动态构建 SQL 语句。请参阅有关游标sp_executesql的 MS 文档。

于 2013-08-31T22:47:13.233 回答
0

是你要找的吗?

SQL小提琴

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')
;

查询 1

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 |
于 2013-08-31T23:12:42.667 回答