我对处理溢出任意限制的文本字段的语法有疑问。
我有以下表格和数据:
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
答案 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)
首先将所有数据放入临时表中。然后在真实表中进行一系列插入并更新到临时表。
确保真实表具有相应的主键和外键,以便您可以在以后重新组合文本。