Подтвердить что ты не робот

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;

Спасибо заранее.

4b9b3361

Ответ 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