sql-server - 创建一个逗号分隔的字符串,其中包含数字 1 到 x,其中 x 是从记录中读取的

标签 sql-server t-sql sql-server-2012

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

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

因此,当字段 steps 包含数字 5 时,我希望在新列 中设置此字符串 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)

上面的代码创建一个临时表,其中包含执行更新所需的数据:

enter image description here

然后在事务中,通过[ID]执行更新:

 BEGIN TRAN

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

COMMIT TRAN

关于sql-server - 创建一个逗号分隔的字符串,其中包含数字 1 到 x,其中 x 是从记录中读取的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41286156/

相关文章:

c# - 如何在子查询中使用 group by 将此 SQL 语句转换为 LINQ

sql - 将合并替换为 case

sql-server - 如何将一个大数据库表拆分为多个数据库表

sql-server - 是否可以在使用sql的更新语句中使用MAX?

r - R 中的 ODBC 连接与 Azure Active Directory 密码身份验证

sql - T-SQL 选择第一个实例

SQL - 限制和排序数据

sql-server - 将表变量传递给 SQL Server 存储过程

sql - 按状态获取每个位置的数量

SQL 仅在 if 语句内抛出