我在MS SQL Server中有一个表,其中包含多个TEXT字段,这些字段可以具有非常长的字符串(从0个字符到100,000个以上的字符)。
我想创建一个视图(或填充报告表的存储过程),以准备将此数据导出到Excel,每个单元有一定的字符数限制(32,767个字符)。
编写查询以截断一定数量的字符后截断字段是相对琐碎的,但是我想创建包含将被截断的文本的新行。
示例-第1行,第1列和第3列包含包装为2行的文本。
ID | COL1 | COL 2 | COL 3 |
1 AAAAAA BBBBBBB CCCCCC
1 AAA CC
2 XX YY ZZ
答案 0 :(得分:2)
您可以尝试以下方法:
一个模型表来模拟您的问题
DECLARE @tbl TABLE(ID INT IDENTITY, LongString VARCHAR(1000));
INSERT INTO @tbl VALUES('blah')
,('blah blah')
,('blah bleh blih bloh')
,('blah bleh blih bloh bluuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh');
-我们可以指定块的长度
DECLARE @Chunk INT=6;
SELECT t.ID
,A.Nmbr AS ChunkNmbr
,SUBSTRING(t.LongString,A.Nmbr*@Chunk+1,@Chunk) AS ChunkOfString
FROM @tbl t
CROSS APPLY(SELECT TOP(LEN(t.LongString)/@Chunk + 1)
ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1
FROM master..spt_values) A(Nmbr);
简而言之:
我们使用带有APPLY
和计算出的TOP
子句的技巧。源master..spt_values
只是具有很多行的公用表。我们不需要这些值,只需要一个集合即可使用ROW_NUMBER()
计算一个运行数字。 APPLY
将被称为逐行。这意味着,长字符串会比短字符串创建更多的数字。
要获取块,我使用一个简单的SUBSTRING()
,在这里我们通过相当简单的乘法来计算每个块的开始。
尝试将此方法用于多于一列的
DECLARE @tbl TABLE(ID INT IDENTITY, LongString1 VARCHAR(1000), LongString2 VARCHAR(1000));
INSERT INTO @tbl VALUES('blah','dsfafadafdsafdsafdsafsadfdsafdsafdsf')
,('blah blah','afdsafdsafd')
,('blah bleh blih bloh','adfdsafdsafdfdsafdsafdafdsaasdfdsafdsafdsafdsafdsafsadfsadfdsafdsafdsafdsafdafdsafdsafadf')
,('blah bleh blih bloh bluuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh','asdfdsaf');
DECLARE @Chunk INT=6;
SELECT t.ID
,A.MaxLen
,B.Nmbr AS ChunkNmbr
,SUBSTRING(t.LongString1,B.Nmbr*@Chunk+1,@Chunk) AS ChunkOfString1
,SUBSTRING(t.LongString2,B.Nmbr*@Chunk+1,@Chunk) AS ChunkOfString1
FROM @tbl t
CROSS APPLY(SELECT MAX(strLen) FROM (VALUES(LEN(t.LongString1)),(LEN(t.LongString2))) vals(strLen)) A(MaxLen)
CROSS APPLY(SELECT TOP(A.MaxLen/@Chunk + 1)
ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1
FROM master..spt_values) B(Nmbr);
新想法:我们首先使用APPLY
查找一行中最长的字符串。我们只需要为此最大数量进行块计算。