2017-06-13 19 views
1

私はCSVファイルintテーブルを変換するために一括挿入コマンドを使用していました。私はCSVファイルをVarBinary値としてVarBinaryファイルとしてVarBinaryファイルからVARCHARにCASTとCONVERT関数を使用して型キャストすることでVarbinaryファイルからデータを取得できます。ファイルの代わりに文字列を一括挿入に渡す方法はありますか?

[email protected] contains varchar value of CSV file content. 
SET @sql = 'BULK INSERT TempCsv 
FROM ''' + @String + ''' 
WITH 
(
    FIRSTROW = 2, 
    FIELDTERMINATOR = '','', 
    ROWTERMINATOR = ''\n'', 
    TABLOCK 
)' 

助けてくださいがme.Isどのような方法か:しかし、今、私は私を助けいずれかinsert.Canバルクを使用して、テーブルにCSV形式のコンテンツを含むこのvarchar型の文字列を変換するカントの問題を得た 私のコード例を以下に示します。 csv文字列からテーブルにデータを挿入する代替方法。

答えて

0

EDIT:許可複数文字の区切り

は、これは私がそれを解決する方法です。それが含む:

  • テーブル行にsplitingの改行のためのテーブル値関数(xftSplit)(CHAR(10))
  • 行のn番目のフィールドを抽出するためのスカラー関数(fSubstrNth)セパレータ所与
  • 負の値を受け入れるようにセパレータ
  • (オプション)代替Right関数のn番目のインデックスを見つけるためのスカラー関数(fPatIndexMulti
  • 最後に、いくつかの特定のコードは、ソリューションで使用する、以来SQLはコードスニペットのための動的テーブル・ファンクションの定義(つまり、あなたがいないSELECT動的な列を持つ関数から缶)今

、LLOW:

xftSplit

-- ============================================= 
-- Author:  Bernardo A. Dal Corno 
-- Create date: 15/07/2014 
-- Description: Quebra valores a partir de caracteres e retorna lista em tabela 
-- ============================================= 
CREATE FUNCTION [dbo].[xftSplit] 
(
    @Texto varchar(max), 
    @Splitter varchar(3) 
) 
RETURNS 
@Lista TABLE 
(
    ValoresQuebrados varchar(8000) 
) 
AS 
BEGIN 
DECLARE @Pos Smallint 

    While len(@Texto)>0 BEGIN 
    SET @Pos = Patindex('%'[email protected]+'%',@Texto) 

    IF @Pos > 0 BEGIN 
     INSERT INTO @Lista 
     SELECT left(@Texto, @Pos-1) 

     SET @Texto = right(@Texto, len(@Texto)[email protected]) 
    END 
    ELSE BEGIN 
     INSERT INTO @Lista 
     SELECT @Texto 

     SET @Texto = '' 
    END 
    End 

    RETURN 
END 

fSubstrNth

-- ============================================= 
-- Author:  Bernardo A. Dal Corno 
-- Create date: 18/07/2017 
-- Description: substring com 2 PatIndex limitando inicio e fim 
-- ============================================= 
CREATE FUNCTION fSubstrNth 
(
    @Text varchar(max), 
    @Sep varchar(3), 
    @N int --Nth campo 
) 
RETURNS varchar(max) 
AS 
BEGIN 
    DECLARE @Result varchar(max) 

    IF @N<1 RETURN '' 
    IF @N=1 
    SET @Result = substring(@Text, 1, dbo.fPatIndexMulti(@Sep,@Text,1)-1) 
    ELSE 
    SET @Result = substring(@Text, dbo.fPatIndexMulti(@Sep,@Text,@N-1)+LEN(@Sep), CASE WHEN dbo.fPatIndexMulti(@Sep,@Text,@N)>0 THEN dbo.fPatIndexMulti(@Sep,@Text,@N)-dbo.fPatIndexMulti(@Sep,@Text,@N-1)-LEN(@Sep) ELSE LEN(@Text)+1 END) 

    RETURN @Result 
END 

fPatIndexMulti

-- ============================================= 
-- Author:  Bernardo A. Dal Corno 
-- Create date: 17/07/2017 
-- Description: recursive patIndex 
-- ============================================= 
CREATE FUNCTION [dbo].[fPatIndexMulti] 
(
    @Find varchar(max), 
    @In varchar(max), 
    @N tinyint 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @lenFind int, @Result int, @Texto varchar(max), @index int 
    DECLARE @i tinyint=1 

    SET @lenFind = LEN(@Find)-1 
    SET @Result = 0 
    SET @Texto = @In 
    WHILE (@i <= @N) BEGIN 
    SET @index = patindex('%'[email protected]+'%',@Texto) 
     IF @index = 0 RETURN 0 
    SET @Result = @Result + @index 
    SET @Texto = dbo.xRight(@Texto, (@index + @lenFind)*-1) 

    SET @i = @i + 1 
    END 
    SET @Result = @Result + @lenFind*(@i-2) 

    RETURN @Result 
END 

xRight

-- ============================================= 
-- Author:  Bernardo A. Dal Corno 
-- Create date: 06/01/2015 
-- Description: Right inverso (para nros < 0) 
-- ============================================= 
CREATE FUNCTION [dbo].[xRight] 
(
    @Texto varchar(8000), 
    @Qntd int 
) 
RETURNS varchar(8000) 
AS 
BEGIN 
    DECLARE @Result varchar(8000) 

    IF (Len(@Texto) = 0) OR (@Qntd = 0) 
    SET @Result = '' 
    ELSE IF (@Qntd > 0) 
     SET @Result = Right(@Texto, @Qntd) 
    ELSE IF (@Qntd < 0) 
    SET @Result = Right(@Texto, Len(@Texto) + @Qntd) 

    RETURN @Result 
END 

特定コード

SELECT 
    acolumn = 'any value', 
    field1 = dbo.fSubstrNth(line,',',1), 
    field2 = dbo.fSubstrNth(line,',',2), 
    anothercolumn = 'set your query as you would normally do', 
    field3 = (CASE dbo.fSubstrNth(line,',',3) WHEN 'C' THEN 1 ELSE 0 END) 
FROM (
    SELECT line = ValoresQuebrados FROM dbo.xftSplit(@StringVariable, char(10)) 
) lines 

なお:

  • fSubstrNthがラインから
  • xftSplitを抽出するために、n番目のフィールドは、あなたが(どんなソース)からバルクにしたい文字列を含む変数を受け取り、受け取ってchar(10)\nのスプリッタとして、それは可能性がありその他
  • クエリは他のものと同じにすることができます。これは、プロシージャ、テーブル機能、ビューなどに格納できることを意味します。
  • ストアドプロシージャで使用する場合、動的列を含む文字列をロードするクエリと一時テーブルを作成する一般的な方法を作成することができますが、データを使用するには別のプロシージャを呼び出す必要があります。または、同じ手順で上記のような特定の問合せを作成する必要があります(非汎用で、再利用可能にする)
関連する問題