[英]T-SQL - How to use results of a query to select multiple rows based on a count
[英]Split query results with long strings into multiple rows in T-SQL
我在MS SQL Server中有一個表,其中包含多個TEXT字段,這些字段可以具有很長的字符串(從0個字符到100,000+個字符)。
我想創建一個視圖(或填充報告表的存儲過程),以准備將此數據導出到Excel,每個單元格具有一定的字符數限制(32,767個字符)。
編寫查詢以在一定數量的字符后截斷字段是相對瑣碎的,但是我想創建包含將被截斷的文本的新行。
示例-第1行,Col1和Col3包含包裝為2行的文本。
ID | COL1 | COL 2 | COL 3 |
1 AAAAAA BBBBBBB CCCCCC
1 AAA CC
2 XX YY ZZ
您可以嘗試以下方法:
一個模擬表來模擬您的問題
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
查找一行中最長的字符串。 我們只需要為此最大數量進行塊計算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.