INSERT INTO TABLE из разделенного запятой varchar-list
Может быть, я не вижу лес для деревьев, но я застрял, поэтому вот вопрос:
Как я могу импортировать/вставлять список разделенных запятыми значений varchar в таблицу?
Я не имею в виду что-то вроде этого:
-
'12345678,87654321,11223344'
но это:
-
'12345678','87654321','11223344'
У меня есть Split
-функция, но в этом случае это бесполезно, не так ли?
Вот простой пример (mock-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;
Спасибо заранее.
Ответы
Ответ 1
Поскольку нет способа просто передать этот "список 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 таблиц на выбор может нанести удар по вышеупомянутому шаблону "union all", так что вам все равно нужно сделать некоторое расщепление эти значения в отдельные утверждения.
Ответ 2
Что-то вроде этого должно работать:
INSERT INTO #IMEIS (imei) VALUES ('val1'), ('val2'), ...
UPDATE:
По-видимому, этот синтаксис доступен только с SQL Server 2008.
Ответ 3
Сервер Sql не (по моим сведениям) имеет встроенную функцию Split.
Функция Split в целом на всех платформах должна иметь разделенное запятыми значение строки, которое должно быть разделено на отдельные строки.
В sql-сервере основной целью или необходимой функцией Split является преобразование строкового значения, разделенного запятыми ('abc, cde, fgh), в таблицу temp с каждой строкой в виде строк.
Следующая функция 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
выберите топ 10 * из dbo.split('Ченнай, Бангалор, Мумбаи', ',')
полное можно найти по ссылке follownig
http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx