Sql server 将逗号分隔的输入添加到表列
我有一张表,里面有三列Sql server 将逗号分隔的输入添加到表列,sql-server,Sql Server,我有一张表,里面有三列 Agent_Listing_Company>- ListingId, AgentId, CompanyId 我想在其中插入逗号分隔的输入。我的意见是 ListingId = '5', AgentId = '6,7,8', CompanyId = '9,10,11' 我正在使用此查询进行插入,但它不起作用 INSERT INTO dbo.Agent_Listing_Company ( ListingId ,
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',',')分割我的公司ID,但是如何分割两个输入。
在表中插入后保存的值应为
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
这一个使用
连接:
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提供的最快的基于集合的拆分器之一。如果要在单步执行中添加多个记录,则应使用(表值参数)。它将使您的插入快速可靠
您需要在代码中执行以下操作:
创建在DB中具有ListingId、AgentId、CompanyId列的表数据类型
在代码(.Net)中创建具有相同架构的数据表
在数据表中添加记录,并在存储过程中将此tvp作为输入参数传递
因此,您的数据表具有想要输入的直接数据。例如
ListingId AgentId CompanyId
5 6 9
5 7 10
5 8 11
我知道这有点难理解,它可以让多次插入和更新变得更容易。试试这个
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
列包含哪种数据类型?如果要插入逗号分隔的值,则直接将其插入列中。为什么要拆分它?如果使用拆分函数,则它将分隔这些值并返回多行。使用逗号分隔的字符串向表中插入多个值可能不是最佳选择。根据客户机(即实际使用insert语句的代码),您可能能够发送表值参数中的值,而不是逗号分隔的字符串。您的问题有点让人困惑,您的目标是什么?是否要将数据作为6,7,8插入单行??或者您想根据逗号将其拆分,并将其插入3行,如第一行6第二行7第三行8同样??插入结果应类似于ListingId、AgentId、,问题中提到的CompanyId 5 6 9 5 10 5 8 11如果代码是PHP或ASP3呢?对于.Net客户机来说,这可能是正确的解决方案,但问题中根本没有提到客户机……我在select及其工作之后使用了独特的关键字。很高兴,我能帮忙:)干杯!!