web-dev-qa-db-ja.com

ストアドプロシージャを使用した一括挿入

私はうまく機能しているクエリがあります:

BULK INSERT ZIPCodes 
FROM  'e:\5-digit Commercial.csv' 
WITH 
( 
     FIRSTROW = 2 ,
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
)

しかし、今私はそれのためのストアドプロシージャを作成したいと思います。

ストアドプロシージャを作成するコードを以下に記述しました。

create proc dbo.InsertZipCode
@filepath varchar(500)='e:\5-digit Commercial.csv'
as
begin
BULK INSERT ZIPCodes 
FROM  @filepath 
WITH 
( 
     FIRSTROW = 2 ,
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
)
end

しかし、その表示エラー:

メッセージ102、レベル15、状態1、プロシージャInsertZipCode、行6 '@filepath'付近の構文が正しくありません。

メッセージ319、レベル15、状態1、プロシージャInsertZipCode、行7キーワード「with」の近くの構文が正しくありません。このステートメントが共通テーブル式、xmlnamespaces句、または変更追跡コンテキスト句である場合、前のステートメントはセミコロンで終了する必要があります。

私が間違っていることと、ストアドプロシージャで動作させるためにできることを教えてください。

ありがとう

30

ストアドプロシージャコードには何も問題はありません-ポイントは:BULK INSERTコマンドは、ファイル名を変数として受け入れることはできません。

これは動作します:

BULK INSERT ZIPCodes 
FROM  'e:\5-digit Commercial.csv' 
WITH 

しかし、これは決して機能しません-ストアドプロシージャ内かどうか:

DECLARE @filename VARCHAR(255)
SET @filename = 'e:\5-digit Commercial.csv' 

BULK INSERT ZIPCodes 
FROM @filename
WITH 

したがって、残念ながら、この方法ではできません。 BULK INSERTステートメントを文字列として(ファイル名を固定して)動的SQLとして実行しますが、他の解決策は実際にはありません。

DECLARE @filepath nvarchar(500)
SET @filepath = N'e:\5-digit Commercial.csv'

DECLARE @bulkinsert NVARCHAR(2000)

SET @bulkinsert = 
       N'BULK INSERT ZIPCodes FROM ''' + 
       @filepath + 
       N''' WITH (FIRSTROW = 2, FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'')'

EXEC sp_executesql @bulkinsert
41
marc_s

試してみてください。このCSVファイルを「E」ドライブに直接アップロードする必要があると思います。そのためには、管理者権限を持っている必要があると思うか、データベース管理者に尋ねてください。

create procedure dbo.InsertZipCode
AS
BEGIN
SET NOCOUNT ON;
 BULK
   INSERT ZIPCodes from 'e:\5-digit Commercial.csv'
WITH
(
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
)
END
0
Dhanya Raj
create PROC TestInsert
    (
      @stuName NVARCHAR(50) ,
      @XmlData XML
    )
AS
    BEGIN
        BEGIN TRY 
            INSERT  INTO dbo.Test_Student
                    ( stuName 
                    )
            VALUES  ( @stuName
                    );
            DECLARE @id BIGINT;
            SET @id = ( SELECT  SCOPE_IDENTITY()
                      ); 
            INSERT  INTO dbo.Test_Qual
                    ( stuid ,
                      stuclass ,
                      InstituteId ,
                      obtmark ,
                      totalmark ,
                      per
                    )
                    SELECT  @id ,
                            col.value('stuclass[1]', 'nvarchar(50)') AS stuclass ,
                            col.value('InstituteId[1]', 'int') AS InstituteId ,
                            col.value('obtmark[1]', 'nvarchar(100)') AS obtmark ,
                            col.value('totalmark[1]', 'nvarchar(50)') AS totalmark ,
                            col.value('per[1]', 'nvarchar(50)') AS per
                    FROM    @XmlData.nodes('Parent/child') AS Doc ( col );  

            SELECT  @id AS RegisIdNUH ,
                    1 AS Flag ,
                    'Save' AS Msg
            FROM    dbo.Test_Student R
            WHERE   R.stuid = @id;

        END TRY
        BEGIN CATCH
            SELECT  0 AS Flag ,
                    'Some Error occur' AS Msg;
            ROLLBACK;
        END CATCH;
    END;
0
Meera

SQLCmd exeにアクセスできる場合、動的SQLに代わるものがあります。

SqlCmdユーティリティでは、-v引数を使用して文字列置換変数を渡すことができます。

「filepath」という名前のテンプレート変数を使用できます。この変数は、cmdlineを介してスクリプトを実行すると置き換えられます。

SQLスクリプトは次のようになります。

BULK INSERT ZIPCodes 
FROM  '$(filepath)' 
WITH 
( 
     FIRSTROW = 2 ,
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
)
end

次に、次のようなコマンドラインからスクリプトを実行します。

sqlcmd -b -S SERVER\INSTANCEHERE -E -i "PATH\FILENAMEHERE.Sql" -v FilePath = "e:\5-digit Commercial.csv" -s "|"

例の重要な部分は-v引数です。

-v FilePath = "e:\5-digit Commercial.csv"
0
Ed Ajaz