Sql server 创建一个逗号分隔的字符串,数字为1到x,其中x从记录中读取

Sql server 创建一个逗号分隔的字符串,数字为1到x,其中x从记录中读取,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我有一个表文档,其中有一个字段步骤。这是一个整数字段,可以包含1到1000之间的数字 现在添加了一个新字段(followedsteps),该字段必须包含从1到[字段步骤中的数字],以逗号分隔 因此,当字段steps包含数字5时,我希望在新列followedsteps中设置该字符串1,2,3,4,5 字段steps不能为空,最低值为1 有没有(简单的)方法可以做到这一点 这是一次迁移。由于只执行一次,最好先生成序列: IF OBJECT_ID('tempdb..#DataSource') IS N

我有一个表
文档
,其中有一个字段
步骤
。这是一个整数字段,可以包含1到1000之间的数字

现在添加了一个新字段(
followedsteps
),该字段必须包含从1到[字段步骤中的数字],以逗号分隔

因此,当字段
steps
包含数字5时,我希望在新列
followedsteps
中设置该字符串
1,2,3,4,5

字段
steps
不能为空,最低值为1

有没有(简单的)方法可以做到这一点


这是一次迁移。

由于只执行一次,最好先生成序列:

IF OBJECT_ID('tempdb..#DataSource') IS NOT NULL
BEGIN;
    DROP TABLE #DataSource;
END;

CREATE TABLE #DataSource
(
    [ID] INT
   ,[Sequence] VARCHAR(MAX)
);

DECLARE @MaximumID INT = 1000; -- in your case: SELECT MAX(steps) FROM document 

WITH DataSource AS
(
    SELECT 1 AS num
    UNION ALL
    SELECT num+1 
    FROM DataSource 
    WHERE num+1<=@MaximumID
)
INSERT INTO #DataSource
SELECT A.[num]
      ,DS.[Sequence]
FROM DataSource A
CROSS APPLY
(
    SELECT STUFF
    (
        (
            SELECT ',' + CAST(B.[num] AS VARCHAR(12))
            FROM DataSource B
            WHERE A.[num] >= B.[num]
            ORDER BY B.[num]
            FOR XML PATH(''), TYPE
        ).value('.', 'VARCHAR(MAX)')
        ,1
        ,1
        ,''
    )
) DS ([Sequence])
option (maxrecursion 32767)

在stackoverflow.com上查看t-sql和sql server标记下的“group_concat”。有几种解决方案可以很容易做到这一点。@JonathonOgden我熟悉在MSSQL中实现
group\u concat
-类型行为的各种方法,但是如何解决需要使所有正整数值低于
步骤中的值的额外问题呢?我看不到您提到的
组\u concat
问题中的任何示例-您是否需要使用数字表,或者对
ROW\u NUMBER()
进行一些古怪的调用,以获得从1到1000的所有数字的列表?错过了1次迁移行+1
 BEGIN TRAN

    UPDATE document 
    SET followedsteps = [Sequence]
    FROM document A
    INNER JOIN ##DataSource B
        ON A.[steps] = b.[id]

COMMIT TRAN