使我的SQL查询动态化

使我的SQL查询动态化,sql,sql-server,dynamic,Sql,Sql Server,Dynamic,我的表有一个ID int PK,然后是col1-col32字符串。“我的列”中的值与“时间”中的值也不相同。有时是10个,有时是全部,以此类推。我可以使这个SQL动态,这样我就不必用我的32列来填充它吗 WITH CTE AS ( SELECT * FROM ( SELECT ID, Column_Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER

我的表有一个ID int PK,然后是col1-col32字符串。“我的列”中的值与“时间”中的值也不相同。有时是10个,有时是全部,以此类推。我可以使这个SQL动态,这样我就不必用我的32列来填充它吗

WITH CTE
AS
(
    SELECT *
    FROM
    (
        SELECT  ID,
                Column_Name,
                ROW_NUMBER() OVER (PARTITION BY ID ORDER BY col) row_num,
                val
        FROM tPivot A
        INNER JOIN (SELECT Column_Name AS COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tPivot' ) B
        ON A.ID = B.ORDINAL_POSITION - 1
        UNPIVOT
        (
            val for col in (col1,col2,col3,col4,col5)
        ) unpvt
    ) A
    PIVOT
    (
        MAX(val) FOR column_name IN (col1,col2,col3,col4,col5)
    ) pvt
)

SELECT *
FROM
(
    SELECT ID,
            row_num,
            coalesce(col1,col2,col3,col4,col5) val
    FROM cte
) A
PIVOT
(
    MAX(val) FOR ID IN ([1],[2],[3],[4],[5])
) pvt
太好了。 要为查询的枢轴部分构建ID,我指的是[1]、[2]、[3]、[4]、[5]使用:

现在您可以在动态sql中使用它:

该模型基于您在评论中提到的fiddle演示中的模式和您的查询


注意:也许您的原始查询可以更优化,我只是想说如何使其与所有idsrows的动态sql一起使用

提供sql摆弄示例数据这就是它的样子,需要正确的部分也是动态的欢迎您,无法让它工作:什么问题?我不知道在哪里粘贴你的解决方案,在哪里做一些更改:it’很抱歉,我是个初学者。这是小提琴中的狂欢。正如我所说,这些值是动态的,每次都可能不同。好的,让我来复习一下it@user2210516,发生了什么事,我在等待反馈,如果不是这样的话,它对你不起作用。我得走了。
DECLARE @IDP AS NVARCHAR(MAX)
SELECT @IDP = STUFF((SELECT ',' + QUOTENAME(ID) 
                    from (select distinct row_num as ID from CTE) q
                    group by q.ID
                    order by q.ID
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
DECLARE @sql AS NVARCHAR(MAX)
SET @sql='
WITH CTE
AS
(
    SELECT *
    FROM
    (
        SELECT  ID,
                Column_Name,
                ROW_NUMBER() OVER (PARTITION BY ID ORDER BY col) row_num,
                val
        FROM tPivot A
        INNER JOIN (SELECT Column_Name AS COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''tPivot'' ) B
        ON A.ID = B.ORDINAL_POSITION - 1
        UNPIVOT
        (
            val for col in (col1,col2,col3,col4,col5)
        ) unpvt
    ) A
    PIVOT
    (
        MAX(val) FOR column_name IN (col1,col2,col3,col4,col5)
    ) pvt
)

SELECT *
FROM
(
    SELECT ID,
            row_num,
            coalesce(col1,col2,col3,col4,col5) val
    FROM cte
) A
PIVOT
(
    MAX(val) FOR ID IN ('+@IDP+')
) pvt'
EXEC(@sql)