Sql双分割分隔符

时间:2016-04-02 08:08:37

标签: sql sql-server split insert delimiter

所以我将字符串值发送到数据库

@string = 'Value1|Value2|Value3|Value4, OtherVal1|OtherVal2|OtherVal3|OtherVal4'

还有其他一些内容

@id ='1'

我想首先将它拆分为',然后将其拆分为|并插入表格

实施例

TABLE
ID     | COLUMN1    |COLUMN2      |COLUMN3      |COLUMN4        |COLUMN5
ai     |  @id       | value1      |value2       |value3         |value4
ai     |  @id2      |otherVal1    |otherVal2    |otherVal3      |otherVal4

这是我到目前为止所做的代码,但是我的另一个函数返回值按值,

DECLARE @string nvarchar(max)
DECLARE @IDSet nvarchar(max)

DECLARE @columnsValue nvarchar(max)
DECLARE @columnsPos int

DECLARE @pos int
DECLARE @nextPost int

DECLARE @delimiter nchar(1)
DECLARE @delimiter2 nchar(1)



SET @delimiter2 = '|'
SET @delimiter = ','

SET @string = 'ColumnName|autocompleteId|autocompleteValue|AndOrStatus,ColumnName1|autocompleteId1|autocompleteValue1|AndOrStatus1'  + @delimiter

SET @pos = charindex(@delimiter, @string)


WHILE(@pos <> 0)
BEGIN
    SET @IDSet = substring(@string,1,@pos -1) + @delimiter2
    --SELECT @IDSet

        SET @columnsPos = charindex(@delimiter2,@IDSet)

        WHILE(@columnsPos <> 0)
        BEGIN
            SET @columnsValue = substring(@IDSet ,1,@columnsPos - 1)
            SELECT @columnsValue
            SET @IDSet = substring(@IDSet,@columnsPos +1, LEN(@IDSet))
            SET @columnsPos = charindex(@delimiter2,@IDSet)
        END

    SET @string = substring(@string,@pos + 1,LEN(@string))
    SET @pos = charindex(@delimiter,@string)
    END

当前代码经过两个while语句并按其分隔符

分割代码

任何想法如何从中插入表格。

1 个答案:

答案 0 :(得分:0)

以下是使用PARSENAME

的一个技巧

首先使用任何拆分字符串方法拆分值。我用XML方法拆分了字符串

然后使用PARSENAME函数将值拆分为列

DECLARE @string VARCHAR(500)= 
        'Value1|Value2|Value3|Value4, OtherVal1|OtherVal2|OtherVal3|OtherVal4'; 

WITH cte 
     AS (SELECT Replace(Rtrim(Ltrim(split.a.value('.', 'VARCHAR(100)'))), '|','.') AS split_data 
         FROM   (SELECT Cast ('<M>' + Replace(@string, ',', '</M><M>') 
                              + '</M>' AS XML) AS Data) AS A 
                CROSS apply data.nodes ('/M') AS Split(a)) 
SELECT COLUMN2= Parsename(split_data, 4), 
       COLUMN3=Parsename(split_data, 3), 
       COLUMN4= Parsename(split_data, 2), 
       COLUMN5=Parsename(split_data, 1) 
FROM   cte 

SQL Server 2016 中,您可以使用STRING_SPLIT函数拆分数据

;WITH cte 
     AS (SELECT split_data = Replace(Rtrim(Ltrim(value)), '|', '.') 
         FROM   String_split(@string, ',')) 
SELECT COLUMN2= Parsename(split_data, 4), 
       COLUMN3=Parsename(split_data, 3), 
       COLUMN4= Parsename(split_data, 2), 
       COLUMN5=Parsename(split_data, 1) 
FROM   cte 

结果:

╔═══════════╦═══════════╦═══════════╦═══════════╗
║  COLUMN2  ║  COLUMN3  ║  COLUMN4  ║  COLUMN5  ║
╠═══════════╬═══════════╬═══════════╬═══════════╣
║ Value1    ║ Value2    ║ Value3    ║ Value4    ║
║ OtherVal1 ║ OtherVal2 ║ OtherVal3 ║ OtherVal4 ║
╚═══════════╩═══════════╩═══════════╩═══════════╝