簡體   English   中英

SQL逗號分隔參數中的值以分隔行

[英]SQL comma separated values in parameter to separate rows

SQL問題

對於存儲過程輸入,例如:

  • @CustomerID ='1,2,3,4,'
  • @Address ='俄勒岡州'
  • @City ='波特蘭'

我需要將值插入單獨的行,如下所示:

    customerID | address city
 --------------+------------------
    1          |  Oregon Portland
    2          |  Oregon Portland
    3          |  Oregon Portland
    4          |  Oregon Portland

我需要有關如何在單個參數中插入CSV值以分隔行的幫助。

使用Jeff Moden的CSV拆分器功能:

declare @CustomerId varchar(8000) = '1,2,3,4,'
      , @Address    varchar(64)   = 'Oregon' 
      , @City       varchar(64)   = 'Portland'

select 
    CustomerId = d.Item
  , Address = @Address
  , City = @City
from [dbo].[delimitedsplit8K](@CustomerId,',') as d
where d.Item <> ''

測試設置: http//rextester.com/COUJVK17338

返回:

+------------+---------+----------+
| CustomerId | Address |   City   |
+------------+---------+----------+
|          1 | Oregon  | Portland |
|          2 | Oregon  | Portland |
|          3 | Oregon  | Portland |
|          4 | Oregon  | Portland |
+------------+---------+----------+

分割字符串參考:

一種方法是遞歸CTE:

with c as (
      select left(@CustomerId, charindex(',', @CustomerId) - 1) as customerid,
             substring(@CustomerId, charindex(',', @CustomerId) + 1, 8000) as rest
      union all
      select left(rest, charindex(',', rest) - 1),
             substring(rest, charindex(',', rest) + 1, 8000)
      from c
      where rest like '%,%'
     )
insert into t(customerid, Address, City)
    select customerid, @Address, @City
    from c
    where customerid <> '';

使用while循環

WHILE len(@CustomerID) >1
BEGIN
insert into MyTable (customerID, Address, City)
values (left(@CustomerID, charindex(',',@CustomerID)), @Address, @City)

@CustomerID = substring(@CustomerID, 
                        charindex(',',@CustomerID)+1,
                        len(@CustomerID)-charindex(',',@CustomerID))

END

使用xQuery的有趣方式

declare @CustomerXML xml = '<i>' + replace(@CustomerID, ',', '</i><i>') + '</i>'

select 
    i.value('.', 'int') as customerID,
    @Address as address,
    @City as city
from @CustomerXML.nodes('for $i in /i where $i != "" return $i') as T(i)

我使用定制的表值分割函數,該函數在定制的定界符上分割定界字符串,並將結果返回到表變量中。

CREATE FUNCTION dbo.[Split]
      (
            @List NVARCHAR(2000),
            @SplitOn NVARCHAR(5)
      ) 
      RETURNS @RtnValue TABLE
      (
            Id INT IDENTITY(1,1),
            Value NVARCHAR(100)
      )
      AS 
      BEGIN
            WHILE (CHARINDEX(@SplitOn,@List)>0)
            BEGIN

                  INSERT INTO @RtnValue (value)
                  SELECT
                        Value = LTRIM(RTRIM(SUBSTRING(@List,1,CHARINDEX(@SplitOn,@List)-1)))

                  SET @List = SUBSTRING(@List,CHARINDEX(@SplitOn,@List)+LEN(@SplitOn),LEN(@List))
            END

            INSERT INTO @RtnValue (Value)
            SELECT Value = LTRIM(RTRIM(@List))
            RETURN
      END;
      GO

     SELECT * from dbo.Split('1,2,3,1',',')
     GO

樣本鏈接: http : //rextester.com/FXX54250

如果使用SQL Server 2016或更高版本(SQL Server 13.0),則可以使用新的STRING_SPLIT函數。

declare @CustomerID varchar(50) = '1,2,3,4,',
    @Address varchar(50) = 'Oregon',
    @City varchar(50) = 'Portland'    

SELECT value as CustomerID, @Address, @City
FROM STRING_SPLIT(@CustomerID, ',')  
WHERE RTRIM(value) <> '';  

輸出:

CustomerID  Address City
1           Oregon  Portland
2           Oregon  Portland
3           Oregon  Portland
4           Oregon  Portland

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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