我对处理超出任意限制的文本字段的语法有疑问。
我有下表和数据:
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