私はうまく機能しているクエリがあります:
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句、または変更追跡コンテキスト句である場合、前のステートメントはセミコロンで終了する必要があります。
私が間違っていることと、ストアドプロシージャで動作させるためにできることを教えてください。
ありがとう
ストアドプロシージャコードには何も問題はありません-ポイントは: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
試してみてください。この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
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;
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"