1

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

我有下表和数据:

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 个字符。为简洁起见,我在这里缩短了它)。

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

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

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

    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 
4

2 回答 2

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

我承认,我的名字很烂:)

于 2013-04-23T22:39:08.663 回答
0

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

确保真实表具有适当的主键和外键,以便之后可以重新组合文本。

于 2013-04-23T22:59:53.400 回答