我的任務是從以前使用的“Notes”Nvarchar(max) 欄位中提取記錄中的唯一值。
CREATE TABLE LWArchive (
Number int,
Notes varchar(MAX))
INSERT INTO LWArchive(Number,Notes)
VALUES(1,'OGC 503360 / 503361 M303834 M303838 M303835 M303836 M303837 M303839 M303840 M303841 303842'),
(2,'OGC = Q.6773'),
(3,'DEED REF = 0001'),
(4,'OGC 50336 / 50336 M30383 M03038 M30383 M30383 M30383 M00303 M303840 M303841 M303842')
select
a.Number,
s.value
from LWArchive a
CROSS APPLY STRING_SPLIT(a.notes, N' ') s
注釋欄位包含多個條形碼,它們都是以空格分隔的格式。
例如'M000001 M000002 M000003'
我嘗試使用以下查詢拆分“注釋”列:
select
a.ID,
s.value
from Archive a
CROSS APPLY STRING_SPLIT(a.notes, N' ') s
不幸的是,雖然有些作業正常,但拆分結果并不一致。在空格分隔的結果中,許多條碼不受影響。下面的例子:

當字串不是來自列并手動輸入到函式中時。它按預期運行。下面的例子:

我使用的是 SQL Server 2019,但是因為這是舊資料。我必須將資料庫從兼容性 110 轉換為 130 才能訪問 String_Split 函式。
uj5u.com熱心網友回復:
正如評論中所建議的,您可能會找到一個字符不是空格而是其他字符的實體。
DECLARE @string NVARCHAR(MAX) = 'M000001 M000002 M000003'
SELECT *, @string
FROM STRING_SPLIT(@string,' ')
value (No column name)
------------------------
M000001 M000001 M000002 M000003
M000002 M000001 M000002 M000003
M000003 M000001 M000002 M000003
這如預期的那樣分裂。我們最終得到 3 行,每行都有一個分隔值。如果我們將其中一個空格更改為選項卡:
SET @string = 'M000001 M000002 M000003'
SELECT *, @string
FROM STRING_SPLIT(@string,' ')
value (No column name)
--------------------------------
M000001 M000001 M000002 M000003
M000002 M000003 M000001 M000002 M000003
我們可以重現您所看到的。
當我遇到類似的問題時,我發現這種技術很有用:
;WITH cte AS (
SELECT @string AS completeString, ASCII(LEFT(@string, 1)) AS asciiCode, LEFT(@string, 1) AS this, RIGHT(@string, LEN(@string)-1) AS that, 1 AS charIndex
UNION ALL
SELECT completeString, ASCII(LEFT(that,1)), LEFT(that,1), RIGHT(that,LEN(that)-1), charIndex 1
FROM cte
WHERE that <> ''
)
SELECT *
FROM cte
這會為字串中的每個字符/字形生成一個結果集,它是 ASCII 碼。
completeString asciiCode this that charIndex
---------------------------------------------------------------------------------
M000001 M000002 M000003 77 M 000001 M000002 M000003 1
M000001 M000002 M000003 48 0 00001 M000002 M000003 2
M000001 M000002 M000003 48 0 0001 M000002 M000003 3
M000001 M000002 M000003 48 0 001 M000002 M000003 4
M000001 M000002 M000003 48 0 01 M000002 M000003 5
M000001 M000002 M000003 48 0 1 M000002 M000003 6
M000001 M000002 M000003 49 1 M000002 M000003 7
M000001 M000002 M000003 32 M000002 M000003 8
M000001 M000002 M000003 77 M 000002 M000003 9
M000001 M000002 M000003 48 0 00002 M000003 10
M000001 M000002 M000003 48 0 0002 M000003 11
M000001 M000002 M000003 48 0 002 M000003 12
M000001 M000002 M000003 48 0 02 M000003 13
M000001 M000002 M000003 48 0 2 M000003 14
M000001 M000002 M000003 50 2 M000003 15
M000001 M000002 M000003 9** M000003 16**
M000001 M000002 M000003 77 M 000003 17
M000001 M000002 M000003 48 0 00003 18
M000001 M000002 M000003 48 0 0003 19
M000001 M000002 M000003 48 0 003 20
M000001 M000002 M000003 48 0 03 21
M000001 M000002 M000003 48 0 3 22
M000001 M000002 M000003 51 3 23
現在我們可以清楚地看到第 16 個字符實際上是一個制表符 (CHAR(9)) 而不是一個空格 (CHAR(32))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/528458.html
標籤:sql服务器分裂
