2017-05-28 58 views
0

我想嘗試插入表中的兩個變量的值與逗號分隔,但我不知道我可以將其插入插入兩個或多個逗號使用SQL

我的情況是低於

分隔在表中的值

我創建臨時表

create table #temp (sku varchar(10), qty int) 

現在宣佈兩個可變值爲

declare @sku varchar(200) = 'RCLET0005,RCLET0015'; 
declare @qty varchar(100) = '2,1'; 

現在我想在#temp表中插入這個變量 我有分割功能。 我想下面的查詢

insert into #temp (sku,qty) values 
((select value from [dbo].[fn_Split](@sku, ',')), 
(select value from [dbo].[fn_Split](@qty, ','))) 
+0

分割函數的輸出是什麼? – DarkKnight

回答

0

你fn_Split函數需要返回每個值的順序位置,以便單獨的列表可以對比。以下是使用派生表子查詢的示例。您也可以使用CTE或CROSS APPLY。

INSERT INTO #temp (sku,qty) 
SELECT 
     sku.value 
    , qty.value 
FROM (SELECT ordinal_position, value FROM [dbo].[fn_Split](@sku, ',') AS sku 
JOIN (SELECT ordinal_position, value FROM [dbo].[fn_Split](@qty, ',') AS qty ON 
    sku.ordinal_position = qty.ordinal_position; 
0

你可以做這樣的事情..

WITH cte AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY null) as rn, value FROM [dbo].[fn_Split](@sku, ',') 
    UNION 
    SELECT 2+(row_number() OVER(ORDER BY null)) as rn, value FROM [dbo].[fn_Split](@qty, ',') 
) 

INSERT INTO #temp 
SELECT c1.value,c2.value 
FROM cte c1 
    INNER JOIN cte c2 ON c2.rn = c1.rn+1 AND c1.rn IN (1,3) AND c2.rn IN (2,4) 
0

假設值在每串有沒有重複,你的分割功能沒有返回的位置,你可以這樣做:

with s as (
     select value, 
      row_number() over (order by (select null)) as pos 
     from dbo.fn_Split(@sku, ',') 
    ), 
    q as (
     select value, 
      row_number() over (order by (select null)) as pos 
     from dbo.fn_Split(@qty, ',') 
    ) 
insert into #temp (sku,qty) 
    select s.value, q.value 
    from s join 
     q 
     on s.pos = q.pos; 

下面的熱膨脹係數不將這些假設可能工作 - 但因爲排序是不穩定的,代碼不是保證工作:

with s as (
     select value, 
      row_number() over (order by charindex(value, @sku)) as pos 
     from dbo.fn_Split(@sku, ',') 
    ), 
    q as (
     select value, 
      row_number() over (order by charindex(value, @qty)) as pos 
     from dbo.fn_Split(@qty, ',') 
    ) 

的替代解決方案不使用fn_split()。他們會使用遞歸CTE或XML。