2017-07-21 49 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

相关问题