使用T-SQL选择带有行号的分块数据

时间:2019-03-10 22:47:31

标签: sql sql-server tsql

我有一个SQL Server表,其中包含一个长文本(varchar(max))列和几个键列。我需要将此数据加载到另一个表中,但将长文本分成多个块(varchar(4000)),因此源表中的每一行都可能成为目标表中的多行。

有没有一种使用T-SQL的方法,它可以在一个select语句中做到这一点并提供row_number?如果可以的话,可以在块大小上进行类似的分区。

2 个答案:

答案 0 :(得分:0)

您可以使用递归子查询:

with cte as (
      select left(longtext, 4000) as val, 1 as rn,
             stuff(longtext, 1, 4000, '') as rest
      from t
      union all
      select left(rest, 4000), rn + 1,
             stuff(longtext, 1, 4000, '') as rest
      from cte
      where longtext > ''
     )
select *
from cte;

您可能还希望包括其他列,但您的问题没有提及它们。

此外,如果您的文本确实很长(例如,每行不止几个块),那么这将不是最有效的方法。有一些使用递归CTE解决此问题的方法。

答案 1 :(得分:0)

递归CTE将字符串拆分为4000个字符的块(作为此逗号拆分线程的一种变体:Turning a Comma Separated string into individual rows

;WITH cte(SomeID, RowNum, DataItem, String) AS
(
    SELECT
        SomeID,
        1,
        LEFT(String, 4000),
        case when len(String) > 4000 then
            RIGHT(String, LEN(String) - 4000)
        else
            ''
        end
    FROM myTable
    UNION all

    SELECT
        SomeID,
        RowNum + 1,
        LEFT(String, 4000),
        case when len(String) > 4000 then 
            RIGHT(String, LEN(String) - 4000)
        else
            ''
        end
    FROM cte
    WHERE
        String > ''
)
SELECT *
FROM cte