Sql 选择编号列

Sql 选择编号列,sql,sql-server,dynamic-sql,Sql,Sql Server,Dynamic Sql,我有一个动态选择查询,它应该获取列col1、col2……col9、col10,但它错误地获取列col1、col10、col11、col12、col2。。。。不确定如何选择它们,因为查询是动态的 请帮忙 这是我一直使用的动态选择 -- CREATE THE COLUMNS REQUIRED SET @DYColumns = STUFF(( SELECT DISTINCT ',' + N'sourceID' + CAST(ROW_NUMBER() OVER

我有一个动态选择查询,它应该获取列col1、col2……col9、col10,但它错误地获取列col1、col10、col11、col12、col2。。。。不确定如何选择它们,因为查询是动态的

请帮忙

这是我一直使用的动态选择

-- CREATE THE COLUMNS REQUIRED 
SET @DYColumns = STUFF(( SELECT DISTINCT 
    ',' + N'sourceID' 
    + CAST(ROW_NUMBER() 
          OVER (PARTITION BY prgmg_product_id ORDER BY prgmg_product_id, source_id_other) 
         AS NVARCHAR(10)) 
    FROM #Prgmg FOR XML PATH('') ), 1, 1, ''); 

如果您使用COALESCE或其他东西来构建列,请确保有一个orderby

此外,您可以使用col01、col02、…col10来确保顺序

Drop Table #Prgmg
CREATE TABLE #Prgmg (
    prgmg_product_id INT
    ,source_id_other INT
    );

INSERT #Prgmg (
    prgmg_product_id
    ,source_id_other
    )
VALUES (3310,11478)
    ,(3337,10833)
    ,(3354,11466)
    ,(4039,4846)
    ,(4039,65454)
    ,(4039,65456)
    ,(13337,110833)   -- Added to force over 10
    ,(13354,111466)   -- Added to force over 10
    ,(14039,14846)    -- Added to force over 10
    ,(14039,165454);  -- Added to force over 10


DECLARE @DYColumns NVARCHAR(1000)
    ,@DYSqlQuery NVARCHAR(4000);

--  CREATE THE COLUMNS REQUIRED
SET @DYColumns = STUFF((
            SELECT DISTINCT ',' 
                    + N'sourceID' 
                    + right('00'+CAST(ROW_NUMBER() OVER (ORDER BY prgmg_product_id, source_id_other) AS NVARCHAR(10)),2)
            FROM #Prgmg
            FOR XML PATH('')
            ), 1, 1, '');



-- CREATE THE DYNAMIC SQL AND ADD IN THE CREATED COLUMNS
SET @DYSqlQuery = '
    SELECT prgmg_product_id,' 
        +   @DYColumns 
        +   ' FROM (
                SELECT prgmg_product_id
                    ,CAST(N''sourceID'' + CAST(ROW_NUMBER() OVER (
                        PARTITION BY prgmg_product_id ORDER BY prgmg_product_id, source_id_other
                        ) AS NVARCHAR(10)) AS NVARCHAR(100)) AS Col
                    ,source_id_other
                FROM #Prgmg S1
        ) X
        PIVOT(MIN(source_id_other) FOR Col IN (' + @DYColumns + ')) P'

Print @DYSqlQuery
--EXECUTE sp_executesql @DYSqlQuery;
返回-请注意,列是按顺序排列的。这是通过对行号进行零填充来完成的

SELECT prgmg_product_id,sourceID01,sourceID02,sourceID03,sourceID04,sourceID05,sourceID06,sourceID07,sourceID08,sourceID09,sourceID10 FROM (
            SELECT prgmg_product_id
                ,CAST(N'sourceID' + CAST(ROW_NUMBER() OVER (
                    PARTITION BY prgmg_product_id ORDER BY prgmg_product_id, source_id_other
                    ) AS NVARCHAR(10)) AS NVARCHAR(100)) AS Col
                ,source_id_other
            FROM #Prgmg S1
    ) X
    PIVOT(MIN(source_id_other) FOR Col IN (sourceID01,sourceID02,sourceID03,sourceID04,sourceID05,sourceID06,sourceID07,sourceID08,sourceID09,sourceID10)) P

显示您的查询!如何编写查询?代码片段比分段问题更容易调试。如何动态选择为col01、col02、col03..然后有许多构建动态SQL的技术。我必须看看你的技巧,以获得更好的建议。-创建所需的列集合@DYColumns=STUFF SELECT DISTINCT',“+N'sourceID”+CASTROW\u编号,按prgmg\u product\u id划分,按prgmg\u product\u id排序,源代码为NVARCHAR10,来自Prgmg,用于XML路径1,1;这是一个am使用…-创建所需列集合@DYColumns=STUFF SELECT DISTINCT',“+N'sourceID'+right'00'+CASTROW_NUMBER OVER PARTITION BY prgmg_product_id ORDER BY prgmg_product_id,source_id_other AS nvarcharchar10,2 FROM prgmg FOR XML PATH,1,1;在列名上添加了填充零-假设不超过99列