Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 server 将逗号分隔的输入添加到表列_Sql Server - Fatal编程技术网

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及其工作之后使用了独特的关键字。很高兴,我能帮忙:)干杯!!