INSERT INTO TABLE из запятого varchar-list - PullRequest
25 голосов
/ 15 июня 2011

Может быть, я не вижу дрова для деревьев, но я застрял, поэтому вот вопрос:

Как я могу импортировать / вставить список разделенных запятыми значений 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;

Заранее спасибо.

Ответы [ 3 ]

43 голосов
/ 15 июня 2011

Примерно так должно работать:

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

ОБНОВЛЕНИЕ:

Очевидно, этот синтаксис доступен только начиная с SQL Server 2008.

14 голосов
/ 15 июня 2011

Поскольку невозможно просто передать этот «список разделенных запятыми вариантов», я предполагаю, что их генерирует какая-то другая система. Если вы можете немного изменить свой генератор, он должен быть работоспособным. Вместо того, чтобы разделять запятыми, вы отделяете 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 таблиц на выборку может сработать с описанным выше шаблоном «объединения всех», поэтому вам все равно нужно будет разделить эти значения на отдельные операторы.

10 голосов
/ 15 июня 2011

Sql Server не имеет (насколько мне известно) встроенной функции Split.Функция разделения в целом на всех платформах будет иметь разделенное запятыми строковое значение, которое будет разбито на отдельные строки.На сервере sql основная цель или необходимая функция Split - преобразовать строковое значение, разделенное запятыми ('abc, cde, fgh'), во временную таблицу с каждой строкой в ​​виде строк.

Разделение нижеФункция является табличной функцией, которая поможет нам разделить строку через запятую (или любое другое значение разделителя) на отдельную строку.

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 ('Ченнай, Бангалор, Мумбаи', ',')

полный список можно найти по ссылке http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...