Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 将逗号分隔的值作为多条记录插入的存储过程_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql 将逗号分隔的值作为多条记录插入的存储过程

Sql 将逗号分隔的值作为多条记录插入的存储过程,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,请帮助我创建一个存储过程,该存储过程接受逗号分隔的值并作为多行插入 因此,一个参数@Name将包含值A、B、C,另一个参数@Id将包含值1,2,3 插入后的表值应如下所示: Name Id ------------ A 1 A 2 A 3 B 1 B 2 B 3 C 1 C 2 C 3 如何编写可以插入逗号分隔值的存储过程

请帮助我创建一个存储过程,该存储过程接受逗号分隔的值并作为多行插入

因此,一个参数
@Name
将包含值A、B、C,另一个参数
@Id
将包含值1,2,3

插入后的表值应如下所示:

Name     Id  
------------
A         1 
A         2 
A         3 
B         1 
B         2 
B         3 
C         1 
C         2 
C         3 
如何编写可以插入逗号分隔值的存储过程,如上图所示。此外,如果表已经包含名称、id对(例如,如果表中已经有a、2),则不应插入


我正在使用SQLServer2005。提前感谢。

这里我们将逗号分隔成行

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
        DROP TABLE #Temp

    IF OBJECT_ID('tempdb..#NewTemp') IS NOT NULL
        DROP TABLE #NewTemp

    Declare  @Testdata table ( name Varchar(max), Data varchar(max))
    insert @Testdata select 'A', '1,2,3'
    insert @Testdata select 'B', '1,2,3'
    insert @Testdata select 'C', '1,2'
    insert @Testdata select 'A', '1,2,3,4'
    insert @Testdata select 'C', '1,2,3,4,5'

    ;with tmp(name, DataItem, Data) as (
    select name, LEFT(Data, CHARINDEX(',',Data+',')-1),
        STUFF(Data, 1, CHARINDEX(',',Data+','), '')
    from @Testdata
    union all
    select name, LEFT(Data, CHARINDEX(',',Data+',')-1),
        STUFF(Data, 1, CHARINDEX(',',Data+','), '')
    from tmp
    where Data > ''
    )
然后插入临时表中

select DISTINCT name, DataItem INTO #Temp
from    tmp WHERE   EXISTS (Select DISTINCT name,DataItem from tmp)
order by name
CREATE TABLE #NewTemp(name Varchar(max), Data varchar(max))
INSERT INTO #NewTemp (name,Data)
Select name,DataItem from #Temp

Select * FROM #NewTemp
这里我们控制重复项的输入,我们可以观察到组合不会像(A,1)、(B,1)那样重复,即使它们是多个

select DISTINCT name, DataItem INTO #Temp
from    tmp WHERE   EXISTS (Select DISTINCT name,DataItem from tmp)
order by name
CREATE TABLE #NewTemp(name Varchar(max), Data varchar(max))
INSERT INTO #NewTemp (name,Data)
Select name,DataItem from #Temp

Select * FROM #NewTemp
像这样的

DECLARE @var1   VARCHAR(100)='A,B,C';
DECLARE @var2   VARCHAR(100)='1,2,3';

WITH rep1(name, delim) AS
(
    SELECT @var1 name, ',' delim

    UNION ALL

    SELECT LEFT(name, CHARINDEX(delim, name, 1) - 1) name, delim
    FROM rep1
    WHERE (CHARINDEX(delim, name, 1) > 0)

    UNION ALL

    SELECT RIGHT(name, LEN(name) - CHARINDEX(delim, name, 1)) name, delim
    FROM rep1
    WHERE (CHARINDEX(delim, name, 1) > 0)
)
,rep2(id, delim) AS
(
    SELECT @var2 id, ',' delim

    UNION ALL

    SELECT LEFT(id, CHARINDEX(delim, id, 1) - 1) id, delim
    FROM rep2
    WHERE (CHARINDEX(delim, id, 1) > 0)

    UNION ALL

    SELECT RIGHT(id, LEN(id) - CHARINDEX(delim, id, 1)) id, delim
    FROM rep2
    WHERE (CHARINDEX(delim, id, 1) > 0)
)
INSERT #table
(Name
,ID)
SELECT
 r1.name
,r2.id
FROM rep1 r1
CROSS JOIN rep2 r2
LEFT JOIN #table t
ON r2.id=t.id
AND t.name=r1.name
WHERE (CHARINDEX(r1.delim, r1.name, 1) = 0)
AND (CHARINDEX(r2.delim, r2.id, 1) = 0)
AND t.name IS NULL
ORDER BY r1.name
,r2.id
OPTION (MAXRECURSION 0);

您可以创建一个用户定义的函数,用于将逗号分隔的值拆分为行,如下所示 这个函数将如何工作以及更多关于它的信息可以找到

创建此函数后,您可以按如下要求使用它

declare @Name VARCHAR(30) 
declare @Id VARCHAR(30) 

SET @Name = 'A,B,C'
SET @Id = '1,2,3'

select A.Data,B.Data FROM dbo.Split(@name,',') A ,dbo.Split(@id,',') B

请显示到目前为止您已尝试的内容。
(名称、ID)
上的唯一性约束应保持表的干净。请检查: