2017-07-21 68 views
0

我有一個很大的字符串值,我正在尋找放入數據庫。我有當前的代碼來做到這一點。在字符串SQL服務器中的兩個字符之間選擇值

DECLARE @Value NVARCHAR(max) = {status} 
DECLARE @DYVALUE TABLE (VALUE NVARCHAR(MAX)) 
INSERT INTO @DYVALUE (value) 
SELECT @VALUE 
;WITH cte 
AS (
SELECT Split.a.value('.', 'VARCHAR(1000)') AS Value 
FROM (
    SELECT CAST('<S>' + REPLACE(Value, ',', '</S><S>') + '</S>' AS XML) AS Value 
    FROM @DyValue 
    ) AS A 
CROSS APPLY Value.nodes('/S') AS Split(a) 
) 

insert into mytable 
SELECT * 
FROM (
SELECT replace(LTRIM(SUBSTRING(Value, 0, CHARINDEX('|', value))),' ','') AS col1 
    ,SUBSTRING(Value, CHARINDEX('|', Value) + 1, LEN(Value)) AS [col2] 
    ,SUBSTRING(Value, CHARINDEX('/', Value) + 1, LEN(Value)) AS [col3] 

FROM Cte 
) dt 

這使我可以放置之前的一切|到第一列,以及第三列之後的所有內容。 我需要嘗試將所有內容放在值'|'之間和「/」成列2

我掙扎着爬

,SUBSTRING(Value, CHARINDEX('|', Value) + 1, LEN(Value)) AS [col2] 

到只需要兩個字符之間的值。

字符串類型的例子這將是上運行的是

1234567890 |再見殘酷的世界/我應該在第3欄第2345678901 |再見殘酷的世界/我應該在第3欄第3456789012 |再見殘忍的世界/請把我置於第3欄,3456789012 |再見殘酷的世界/請把我置於第3欄,6324589657 | Hello World /我需要在Col 3,1145698763 |再見殘酷的世界/我應該在第3欄,36985214728 |再見殘酷的世界/我應該在第3列,7412589635 |再見殘酷的世界/我應該在列3,7412589635 |再見殘酷的世界/我應該在列3,6398756951 |請幫助我/請把我放進第3欄,

該字符串將採用該格式,我剛將這些值更改爲稍微有趣的值。

任何幫助將不勝感激。

使用 的Microsoft SQL Server 2012(SP3)

回答

0

如果它總是三個字每個逗號之間和文字不超過128個字符,然後使用PARSENAME

;WITH cte 
    AS (SELECT Split.a.value('.', 'VARCHAR(1000)') AS Value 
     FROM (SELECT Cast('<S>' + Replace(Value, ',', '</S><S>') + '</S>' AS XML) AS Value 
       FROM @DyValue) AS A 
       CROSS APPLY Value.nodes('/S') AS Split(a)) 
SELECT Parsename(string, 3), 
     Parsename(string, 2), 
     Parsename(string, 1) 
FROM (SELECT Replace(Replace(value, '|', '.'), '/', '.') string 
     FROM cte)a 

的另一種方式,將與任意數量的字符

WITH cte 
    AS (SELECT Split.a.value('.', 'VARCHAR(1000)') AS Value 
     FROM (SELECT Cast('<S>' + Replace(Value, ',', '</S><S>') + '</S>' AS XML) AS Value 
       FROM @DyValue) AS A 
       CROSS APPLY Value.nodes('/S') AS Split(a)) 
SELECT LEFT(value, Charindex('|', value) - 1), 
     Substring(value, Charindex('|', value) + 1, Charindex('/', value) - Charindex('|', value) - 1), 
     Substring(value, Charindex('/', value) + 1, Len(value)) 
FROM cte 
+0

我希望它永遠是三個詞,詞的數量會有所不同抱歉。 – Phil

+0

@菲爾 - 這是一個例子..現在檢查 –

+0

類似於上面的答案,我得到錯誤 「無效的長度參數傳遞給左或SUBSTRING函數」 當試圖運行此 – Phil

0

如果我正確理解了這個問題,這可能是一個解決方案:

SELECT 
SUBSTRING(Value, 0, CHARINDEX('|', Value)) AS column1, 
SUBSTRING(Value, CHARINDEX('|', Value) + 1, CHARINDEX('/', Value) 
    - CHARINDEX('|', Value) - 1) AS column2, 
SUBSTRING(Value, CHARINDEX('/', Value) + 1, LEN(Value)) AS column3 

編輯由於反饋:

SELECT 
SUBSTRING(Value, 0, CHARINDEX('|', Value)) AS column1, 
SUBSTRING(Value, CHARINDEX('|', Value) + 1, 
    CHARINDEX('/', Value) - CHARINDEX('|', Value) - 1) AS column2, 
SUBSTRING(Value, CHARINDEX('/', Value) + 1, LEN(Value) - CHARINDEX('/', Value)) AS column3 
+0

即使我不嘗試將這些插入到數據庫中,我得到錯誤 「傳遞給LEFT或SUBSTRING函數的長度參數無效」 – Phil

+0

@Phil:Hmmm這很奇怪。對我來說它工作。我編輯了我的答案以更改'LEN'部分。也許這有助於... – schlonzo

相關問題