我有一个SQL Server表,其中包含一个长文本(varchar(max)
)列和几个键列。我需要将此数据加载到另一个表中,但将长文本分成多个块(varchar(4000)
),因此源表中的每一行都可能成为目标表中的多行。
有没有一种使用T-SQL的方法,它可以在一个select语句中做到这一点并提供row_number
?如果可以的话,可以在块大小上进行类似的分区。
答案 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