web-dev-qa-db-ja.com

カンマ区切りのvarchar-listからINTO TABLEを挿入

木のために木が見えないかもしれませんが、私は立ち往生しているので、ここに質問があります:

コンマ区切りのvarchar-valuesのリストをテーブルにインポート/挿入するにはどうすればよいですか?私はこのようなことを意味するものではありません:

  • '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;

前もって感謝します。

25
Tim Schmelter

この「コンマで区切られたvarcharのリスト」を単に渡す方法がないので、他のシステムがそれらを生成していると思います。ジェネレータをわずかに変更できる場合は、実行可能であるはずです。コンマで区切るのではなく、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テーブル の制限は上記の「すべてを結合」パターンで開始される可能性があるため、これらの値を別のステートメントに分割する必要があります。

14

このような何かが動作するはずです:

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

更新:

どうやらこの構文は、SQL Server 2008以降でのみ使用可能です。

44
André Morujão

Sql Serverには(私の知る限りでは)組み込みのSplit関数がありません。一般に、すべてのプラットフォーム上の分割関数は、個々の文字列に分割されるコンマ区切りの文字列値を持ちます。 SQLサーバーでは、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を選択します。

完全なものは、次のリンクで見つけることができます http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table。 aspx

10