【问题标题】:INSERT INTO TABLE from comma separated varchar-list从逗号分隔的 varchar-list 插入表
【发布时间】:2011-09-15 07:59:52
【问题描述】:

也许我只见树木不见森林,但我被困住了,所以问题来了:

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

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

我有一个Split-Function,但在这种情况下它似乎没用,不是吗?

这是一个简单的(模拟 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;

提前谢谢你。

【问题讨论】:

    标签: sql sql-server-2005 tsql insert


    【解决方案1】:

    这样的事情应该可以工作:

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

    更新:

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

    【讨论】:

    • 该列表的长度约为 5000 个,因此我正在寻求一种以某种方式自动执行此操作的方法。我当然可以写一个小程序,但我希望有SQL的方式。
    • SQL Server 2005 的VALUES 不支持多行构造函数/table value constructors(从 2008 年开始支持)
    • 谢谢达米安。我快速检查了语法,但我想我正在查看 2008 而不是 2005。
    • @TimSchmelter - 有时在制作重复的 SQL 语句时,Excel 可能是你最好的朋友。放入包含 5,000 个值的列表,然后使用另一列中的公式来设置它们的格式,在本例中为“('val1')”,或者您可能需要的任何其他内容。
    • SQL server 在给定的 INSERT 语句中最多只支持 1000 个行值表达式。违反会导致错误 “INSERT 语句中的行值表达式的数量超过了允许的 1000 个行值的最大数量。”(在 MSSQL 2016 中)
    【解决方案2】:

    由于没有办法只传递这个“逗号分隔的 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 限制可能会与上述“联合所有”模式一起出现,因此您仍然需要将这些值拆分为单独的语句。

    【讨论】:

    • 这对我有用,虽然我希望在 SQL 中解决这个问题。在这种情况下,256 tables per select 似乎不是一个限制,我已经用 8000 个值对其进行了测试,它可以工作(尽管 11 秒的性能非常差)。谢谢。
    【解决方案3】:

    Sql Server(据我所知)没有内置拆分功能。 通常,所有平台上的拆分功能都会将逗号分隔的字符串值拆分为单独的字符串。 在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('Chennai,Bangalore,Mumbai',',') 中选择前 10 个 *

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

    【讨论】:

    • OP 已经声明他们有一个 split 函数,但他们没有一个包含逗号分隔值的 varchar
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多