溢出文本字段到多行

时间:2013-04-23 22:15:07

标签: sql sql-server-2008 tsql

我对处理溢出任意限制的文本字段的语法有疑问。

我有以下表格和数据:

CREATE TABLE [dbo].[Notes](
[Note] [varchar](max) NULL,
[Code1] [varchar](50) NULL,
[Code2] [varchar](50) NULL
) 

INSERT INTO Notes (Code1,Code2,Note)

VALUES
('JAD','XFR','Lorem ipsum dolor sit amet'),
('JAD','X400','Lorem ipsum '),
('JAD','X700','Lorem ')

我的任务是创建一个将返回表中所有数据的查询,但是接收系统在notes字段上有一个字符限制(真实系统只接受255个字符。为简洁起见,我在这里缩短了它)

为了处理这个限制,我需要的是当notes字段溢出限制时,查询应该在输出中添加另一行,其中包含注释文本的下一部分,但该行的前两个字段应该重复前两个代码。

下面的查询完成了任务,但它非常难看且有局限性。我希望找到一个更加优雅的解决方案来解决这个问题。

此外,接收系统是客户端系统。我不知道为什么它本来想要一个这个灵魂愚蠢的格式的数据转储,所以请不要问。

    DECLARE @TEMP TABLE (
    RowNumber INT,
    Depth INT,
    Code1 VARCHAR(50),
    Code2 VARCHAR(50),
    Note VARCHAR(MAX)    
)

INSERT INTO @TEMP
SELECT
row_number() OVER (ORDER BY Code1),
1,
Code1,
Code2,
left(Note,(5 - len(Code1) + len(Code2)))
FROM Notes

UNION ALL

SELECT
row_number() OVER (ORDER BY Code1),
2,
Code1,
Code2,
substring(Note,(5 - len(Code1) + len(Code2))+1,5)
FROM Notes


UNION ALL

SELECT
row_number() OVER (ORDER BY Code1),
3,
Code1,
Code2,
substring(Note,(5 - len(Code1) + len(Code2))+6,5)
FROM Notes


UNION ALL

SELECT
row_number() OVER (ORDER BY Code1),
4,
Code1,
Code2,
substring(Note,(5 - len(Code1) + len(Code2))+11,5)
FROM Notes



UNION ALL

SELECT
row_number() OVER (ORDER BY Code1),
5,
Code1,
Code2,
substring(Note,(5 - len(Code1) + len(Code2))+16,5)
FROM Notes



Select
Code1,
Code2,
Note
FROM @TEMP AS T
WHERE NOTE <> ''
ORDER BY RowNumber, Depth

输出应如下所示:

Code1   Code2   Note
JAD     XFR     Lorem
JAD     XFR      ipsu
JAD     XFR     m dol
JAD     XFR     or si
JAD     XFR     t ame
JAD     X400    Lorem 
JAD     X400    ipsum
JAD     X700    Lorem 

2 个答案:

答案 0 :(得分:2)

这个怎么样:

WITH Note1(note, code1, code2, start, orig) AS
(
    SELECT SUBSTRING(Note, 1, 5), Code1, Code2, 1, Note
    FROM Notes

    UNION ALL

    SELECT SUBSTRING(orig, start + 5, 5), Code1, Code2, start + 5, orig
    FROM Note1
    WHERE LEN(SUBSTRING(orig, start + 5, 5)) > 0
)
SELECT code1, code2, note FROM Note1
ORDER BY Note1.code2, Note1.start

我承认,我的命名很糟糕:)

答案 1 :(得分:0)

首先将所有数据放入临时表中。然后在真实表中进行一系列插入并更新到临时表。

确保真实表具有相应的主键和外键,以便您可以在以后重新组合文本。