簡體   English   中英

將長字符串的查詢結果拆分為T-SQL中的多行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM