我有一张表中有三列
Agent_Listing_Company>-
ListingId, AgentId, CompanyId
我想在其中插入逗号分隔的输入。我的意见就像
ListingId = '5', AgentId = '6,7,8', CompanyId = '9,10,11'
我正在使用此查询进行插入,但它无法正常工作
INSERT INTO dbo.Agent_Listing_Company
( ListingId ,
AgentId ,
CompanyId
)
SELECT 5, item ,
(select item from dbo.fn_split('9,10,11' , ','))
FROM dbo.fn_split('6,7,8', ',')
- 这里dbo.fn_split(' 6,7,8',',')拆分了我的CompanyIds,但是如何拆分两个输入。 插入表格后我保存的值应为
ListingId, AgentId, CompanyId
5 6 9
5 7 10
5 8 11
我的dbo.fn_split(' 6,7,8',',')功能是......
USE [XRC]
GO
/****** Object: UserDefinedFunction [dbo].[fn_split] Script Date: 6/3/2015 10:04:07 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER function [dbo].[fn_split](
@str varchar(max),
@delimiter char(1)
)
returns @returnTable table (idx int primary key identity, item varchar(8000))
as
begin
declare @pos int
select @str = @str + @delimiter
while len(@str) > 0
begin
select @pos = charindex(@delimiter,@str)
if @pos = 1
insert @returnTable (item)
values (null)
else
insert @returnTable (item)
values (substring(@str, 1, @pos-1))
select @str = substring(@str, @pos+1, len(@str)-@pos)
end
return
end
答案 0 :(得分:1)
这个使用JOIN
:
INSERT INTO dbo.Agent_Listing_Company(
ListingId,
AgentId,
CompanyId
)
SELECT
5, s1.item, s2.item
FROM dbo.fn_split('6,7,8', ',') s1
INNER JOIN dbo.fn_split('9,10,11' , ',') s2
on s2.idx = s1.idx
作为旁注,您的split
功能很慢。它以RBAR
方式进行分割。您应该使用基于集合的方法替换它。请阅读Jeff Moden的article,了解其中一个最快的基于集合的分割器。
答案 1 :(得分:1)
如果您想单次添加多条记录,则应使用TVP(表值参数)。它将使您的插入快速可靠。
您需要在代码中执行以下操作:
因此您的数据表具有您想要输入的直接数据。对于e,g
ListingId AgentId CompanyId
5 6 9
5 7 10
5 8 11
我知道它有点难以理解,随时都可以更轻松地进行多次插入和更新。
答案 2 :(得分:1)
试试这个
insert into Agent_Listing_Company ( ListingId ,
AgentId ,
CompanyId
)
SELECT 5, a.item , b.item
FROM dbo.fn_split('6,7,8', ',') a
inner join dbo.fn_split('9,10,11' , ',') as b on a.idx = b.idx