[英]SQL comma separated values in parameter to separate rows
SQL問題
對於存儲過程輸入,例如:
。 我需要將值插入單獨的行,如下所示:
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.