我是sql server的新手,需要帮助创建一个查询,以便使用存储过程在一次调用中将所有数据插入到表中。
例如,我有1个用户(说" Tech"有Id 1)和客户列表(" C#"," ASP"," MVC&#34 )
。
我的表结构
Id(PK),
用户ID(FK)
客户varchar。
可接受的结果如
用户ID ---- | -----客户
1 ---------- | ----- C#
1 ---------- | ----- ASP
1 ---------- | ----- MVC
我会将userId和客户列表传递给我的SP。
答案 0 :(得分:1)
这样做的一种方法如下。我假设您输入的格式为@ userId = 1,@ ListOfSubjects ='asp,c#'.. 这是示例proc。我们的想法是首先将列表od逗号分隔的字符串转换为表格,然后插入它。为此,我创建了一个示例UDF,它将以逗号分隔的字符串传递给它时重新调用表。
create proc SampleUser_Insert
@UserId int ,
@ListOfSubjects varchar(1000)
as
begin
--set @UserId=1
--set @ListOfSubjects ='asp,c#,mvc'
declare @sampleTable table (userId int, subjects varchar(100))
insert into @sampleTable (userId,subjects )
SELECT @userId, data FROM dbo.[SplitString](@ListOfSubjects, ',')
select * from @sampleTable
end
-- exec SampleUser_Insert 1,'a,b,c'
udf如下
CREATE FUNCTION [dbo].[SplitString]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split
)
GO