插入到表格中,从逗号分隔的 varchar 列表开始。
插入到表格中,从逗号分隔的 varchar 列表开始。
也许我没有看到问题的关键所在,但我卡住了,所以这是问题:
如何将一个逗号分隔的varchar值列表导入/插入到表中?
我不是指像这样的:
'12345678,87654321,11223344'
而是这样的:
'12345678','87654321','11223344'
我有一个Split函数,但在这种情况下似乎无用,对吗?
这里有一个简单的(模拟SQL)示例来说明我的意思:
创建表#IMEIS( imei varchar(15) ) INTO INTO #IMEIS(imei) SELECT * FROM('012251000362843','012251001084784','012251001168744','012273007269862','012291000080227','012291000383084','012291000448515') SELECT * from #IMEIS DROP TABLE #IMEIS;
谢谢您的帮助。
在这个问题中,有人想要将一个逗号分隔的varchar列表插入数据库表中。他尝试了以下的语法:INSERT INTO #IMEIS (imei) VALUES ('val1'), ('val2'), ...
,但出现了问题。
问题的原因是,这种语法只在SQL Server 2008及以上版本中可用。而他所使用的SQL Server版本是2005,因此不支持这种多行构造器/表值构造器的语法。
解决这个问题的方法是,使用INSERT INTO... SELECT
语句来插入值。具体的语法如下:INSERT INTO #IMEIS (imei) SELECT IMEI FROM (VALUES ('val1'), ('val2'), ...) AS tmp(IMEI)
。这种方法能够绕过1000行值表达式的限制。
对于1000行值表达式的限制解决方案是使用INSERT INTO... SELECT
来选择值,具体语法如:INSERT INTO #IMEIS (imei) SELECT IMEI FROM (VALUES ('val1'), ('val2'), ...) AS tmp(IMEI)
。这种方法能够绕过1000行值表达式的限制。
总结起来,这个问题的原因是使用了不兼容的语法,解决方法是改用INSERT INTO... SELECT
语句来插入值。
问题的原因是无法直接传递逗号分隔的varchar列表给INSERT INTO TABLE语句。作者推测可能是由其他系统生成了这些列表。如果可以稍微修改生成器,问题就可以解决。不再使用逗号分隔,而是使用union all select
进行分隔,并且需要在列表前加上select
关键字。最后,在子查询中为表和列提供别名。然而,根据对另一个答案的评论,如果要添加5000个条目,以上的"union all"模式可能会受到256个表每个select的限制,因此仍需要将这些值拆分为单独的语句。
解决方法是将列表拆分为多个INSERT INTO TABLE语句。以下是一个例子:
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;
作者在评论中提到,这种方法在他的情况下可以工作,即使测试了8000个值也可以,但性能很差,需要11秒。
在SQL Server中,没有内置的Split函数。通常,在所有平台上的Split函数都会将逗号分隔的字符串值拆分为单独的字符串。
在SQL Server中,Split函数的主要目的是将逗号分隔的字符串值('abc,cde,fgh')转换为一个临时表,每个字符串作为一行。
下面的Split函数是一个表值函数,它可以帮助我们将逗号分隔(或任何其他分隔符)的字符串拆分为单独的字符串。
CREATE FUNCTION dbo.Split( varchar(8000), char(1)) returns TABLE (items varchar(8000)) as begin declare int declare varchar(8000) select = 1 if len()<1 or is null return while != 0 begin set = charindex(,) if !=0 set = left(, - 1) else set = if(len()>0) insert into (Items) values() set = right(,len() - ) if len() = 0 break end return end
使用该Split函数的示例代码如下:
select top 10 * from dbo.split('Chennai,Bangalore,Mumbai',',')
可以在以下链接找到完整的代码:
问题的提出者已经说明他们有一个拆分函数,但他们没有一个包含逗号分隔值的单个varchar字符串。