我将2个以分号分隔的字符串与其他具有简单值的变量一起传递给存储过程。 这些分号分隔值实际上需要拆分并作为不同的行插入。 分号分隔值都不相互关联,因此可以按任意顺序一起插入2个不同的字段。分割是通过使用 折叠|复制代码 从SplitString中选择CAST(DATA AS INT)作为id('30:40:50',':') 但我想结合这两个分裂,以便我可以将它们一起传递到单个插入语句中。
例如,我有string1 '30:40:50'和string2 '23,58,48,60'和一些值@ id = 101,datecreated ......
现在我想将这些值插入一个看起来像这样的表,
101 30 23 Jun 25 2013 12:22PM
101 40 58 Jun 25 2013 12:22PM
101 50 48 Jun 25 2013 12:22PM
101 null 60 Jun 25 2013 12:22PM
任何字符串都可以更长或更小或相等。
我无法弄清楚这样做的正确方法
任何人都可以帮助我。
答案 0 :(得分:1)
试试这个 -
使用LEFT JOIN查询:
DECLARE
@s1 VARCHAR(50)
, @s2 VARCHAR(50)
SELECT
@s1 = '30:40:50'
, @s2 = '23,58,48,60'
SELECT
record_id = 104
, t2.id1
, t3.id2
, dt = CONVERT(VARCHAR(20), GETDATE(), 100)
FROM [master].dbo.spt_values t
LEFT JOIN (
SELECT
id1 = t.c.value('@s', 'INT')
, rn = ROW_NUMBER() OVER (ORDER BY 1/0)
FROM (
SELECT field = CAST('<t s = "' +
REPLACE(
@s1 + ':'
, ':'
, '" /><t s = "') + '" />' AS XML)
) d
CROSS APPLY field.nodes('/t') t(c)
WHERE t.c.value('@s', 'VARCHAR(5)') != ''
) t2 ON t.number = t2.rn
LEFT JOIN (
SELECT
id2 = t.c.value('@s', 'INT')
, rn = ROW_NUMBER() OVER (ORDER BY 1/0)
FROM (
SELECT field = CAST('<t s = "' +
REPLACE(
@s2 + ','
, ','
, '" /><t s = "') + '" />' AS XML)
) d
CROSS APPLY field.nodes('/t') t(c)
WHERE t.c.value('@s', 'VARCHAR(5)') != ''
) t3 ON t.number = t3.rn
WHERE (t2.id1 IS NOT NULL OR t3.id2 IS NOT NULL)
AND t.[type] = 'p'
使用FULL OUTER JOIN进行查询:
SELECT
record_id = 104
, t2.id1
, t3.id2
, dt = CONVERT(VARCHAR(20), GETDATE(), 100)
FROM (
SELECT
id1 = t.c.value('@s', 'INT')
, rn = ROW_NUMBER() OVER (ORDER BY 1/0)
FROM (
SELECT field = CAST('<t s = "' +
REPLACE(
@s1 + ':'
, ':'
, '" /><t s = "') + '" />' AS XML)
) d
CROSS APPLY field.nodes('/t') t(c)
WHERE t.c.value('@s', 'VARCHAR(5)') != ''
) t2
FULL OUTER JOIN (
SELECT
id2 = t.c.value('@s', 'INT')
, rn = ROW_NUMBER() OVER (ORDER BY 1/0)
FROM (
SELECT field = CAST('<t s = "' +
REPLACE(
@s2 + ','
, ','
, '" /><t s = "') + '" />' AS XML)
) d
CROSS APPLY field.nodes('/t') t(c)
WHERE t.c.value('@s', 'VARCHAR(5)') != ''
) t3 ON t2.rn = t3.rn
<强>输出:强>
record_id id1 id2 dt
----------- ----------- ----------- --------------------
104 30 23 Jun 25 2013 3:50PM
104 40 58 Jun 25 2013 3:50PM
104 50 48 Jun 25 2013 3:50PM
104 NULL 60 Jun 25 2013 3:50PM