Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从分号分隔的列表中插入_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 从分号分隔的列表中插入

Sql server 从分号分隔的列表中插入,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我将2个分号分隔的字符串与其他具有简单值的变量一起传递给存储过程。 这些分号分隔的值实际上需要拆分并作为不同的行插入。 两个分号分隔的值互不相关,因此可以按任意顺序插入到两个不同的字段中 折叠|复制代码 从SplitString('30:40:50',':'中选择强制转换(数据为INT)作为id 但我想结合这两个拆分,以便将它们一起传递到单个insert语句中 比如说,, 我有string1'30:40:50'和string2'23,58,48,60'以及一些值@id=101,datecreat

我将2个分号分隔的字符串与其他具有简单值的变量一起传递给存储过程。 这些分号分隔的值实际上需要拆分并作为不同的行插入。 两个分号分隔的值互不相关,因此可以按任意顺序插入到两个不同的字段中 折叠|复制代码 从SplitString('30:40:50',':'中选择强制转换(数据为INT)作为id 但我想结合这两个拆分,以便将它们一起传递到单个insert语句中

比如说,, 我有string1'30:40:50'和string2'23,58,48,60'以及一些值@id=101,datecreated

现在我想把这个值插入一个如下表中

101 30 23 2013年6月25日下午12:22

101 40 58 2013年6月25日下午12:22

101 50 48 2013年6月25日下午12:22

101空60 2013年6月25日下午12:22

任何字符串都可以更长、更小或相等

我想不出做这件事的正确方法

谁能帮我做这个吗。

试试这个-

使用左连接进行查询:

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

这个问题已经被问了几百次了。搜索逗号分隔或CSV,然后执行与上述操作相同的操作,只是将
替换为
…可能的重复找到了答案,通过张贴在任何方式感谢大家的努力和支持reply@shiv,如果我的解决方案也适合您,请批准。