2017-05-28 4 views
0

Ich will versuchen, zwei Variable in Tabelle einzufügen der Wert mit Komma getrennt ist, aber ich weiß nicht, wie ich esLegen Sie zwei oder mehr durch Kommata getrennte Werte in Tabelle mit SQL

einfügen

Meine Situation unter

ist

I erstellen temporäre Tabelle

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

erklären nun zwei Variable mit Wert

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

jetzt möchte ich diese Variable in #temp Tabelle einfügen Ich habe Split-Funktion. Ich versuchte Below Abfrage

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

Was ist die Ausgabe der Split-Funktion? – DarkKnight

Antwort

0

Ihre fn_Split Funktion muss die Ordnungsposition jedes Wert zurückgeben, so dass die separaten Listen korreliert werden können. Im Folgenden finden Sie ein Beispiel mit einer abgeleiteten Tabellenunterabfrage. Sie können auch CTEs oder CROSS APPLY verwenden.

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

Sie so etwas tun könnte ..

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

die Werte Unter der Annahme, nicht in jeder Kette wiederholt und Ihre Split-Funktion wird die Position nicht zurückkehren, können Sie tun:

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; 

Folgende CTEs wahrscheinlich ohne diese Annahmen funktionieren würde - aber da die Anordnung nicht stabil ist, ist der Code nicht garantiert zu arbeiten:

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, ',') 
    ) 

die alternativen Lösungen nicht verwenden fn_split(). Sie würden rekursive CTEs oder XML verwenden.

Verwandte Themen