将逗号分隔的输入添加到表格列

时间:2015-06-03 05:19:29

标签: 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 ,
                          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

3 个答案:

答案 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(表值参数)。它将使您的插入快速可靠。

您需要在代码中执行以下操作:

  1. 在DB中创建具有ListingId,AgentId,CompanyId列的表数据类型。
  2. 在代码(.Net)中创建具有相同架构的数据表。
  3. 在数据表中添加记录,并将此tvp作为输入参数传递给sproc。
  4. 因此您的数据表具有您想要输入的直接数据。对于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