从逗号分隔的varchar-list插入INTO TABLE

时间:2011-06-15 08:01:25

标签: sql sql-server-2005 tsql insert

也许我没有看到树木的木头,但我被卡住了,所以这就是问题:

如何将逗号分隔的varchar-values列表导入/插入到表中? 我的意思不是这样的:

  • '12345678,87654321,11223344' 但是这个:
  • '12345678','87654321','11223344'

我有Split - 功能,但在这种情况下似乎没用,不是吗?

这是一个简单的(模拟SQL)示例来显示我的意思:

Create Table #IMEIS(
    imei varchar(15)
)
INTO INTO #IMEIS(imei)
    SELECT * FROM ('012251000362843', '012251001084784', '012251001168744', '012273007269862', '012291000080227', '012291000383084', '012291000448515')
SELECT * from #IMEIS
DROP TABLE #IMEIS;

提前谢谢。

3 个答案:

答案 0 :(得分:43)

这样的事情应该有效:

INSERT INTO #IMEIS (imei) VALUES ('val1'), ('val2'), ...

<强>更新

显然,此语法仅在SQL Server 2008上可用。

答案 1 :(得分:13)

由于没有办法只传递这个“逗号分隔的varchars列表”,我假设其他系统正在生成它们。如果你可以略微修改你的发电机,它应该是可行的。您不是用逗号分隔,而是用union all select分隔,并且还需要在列表中添加select。最后,您需要为子选择中的表和列提供别名:

Create Table #IMEIS(
    imei varchar(15)
)
INSERT INTO #IMEIS(imei)
    SELECT * FROM (select '012251000362843' union all select '012251001084784' union all select '012251001168744' union all
                   select '012273007269862' union all select '012291000080227' union all select '012291000383084' union all
                   select '012291000448515') t(Col)
SELECT * from #IMEIS
DROP TABLE #IMEIS;

但请注意您对另一个答案的评论,即要添加5000个条目。我相信256 tables per select限制可能会带来上述“联合所有”模式,所以你仍然需要将这些值拆分成单独的语句。

答案 2 :(得分:10)

Sql Server没有(据我所知)具有内置的Split功能。 通常在所有平台上的拆分功能都将以逗号分隔的字符串值拆分为单独的字符串。 在sql server中,Split函数的主要目标或必要是将逗号分隔的字符串值('abc,cde,fgh')转换为临时表,每个字符串为行。

下面的Split函数是表值函数,它可以帮助我们将逗号分隔(或任何其他分隔符值)字符串拆分为单个字符串。

CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))       
returns @temptable TABLE (items varchar(8000))       
as       
begin       
    declare @idx int       
    declare @slice varchar(8000)       

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items) values(@slice)       

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return       
end  

从dbo.split中选择前10名*('Chennai,Bangalore,Mumbai',',')

完整可以在follownig链接找到 http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx