試してないけど
set @maxseq = @maxseq - 1;
bulk insert test_table
from 'C:\data\test.csv'
with
(firstrow = 1,lastrow = @maxseq,formatfile = 'C:\ImportOrg_Fmt.xml');
でうまくいくような気がする。
それでだめなら
declare cmdstr as varchar(2000);
set @maxseq = @maxseq - 1;
set cmdstr =
'bulk insert test_table
from ''C:\data\test.csv''
with
(firstrow = 1,lastrow = ' + @maxseq + ',formatfile = ''C:\ImportOrg_Fmt.xml'')';
exec (cmdstr);
といった感じで書く。
execは
http://msdn.microsoft.com/ja-jp/library/ms188332.aspx
参照。
質問者
お礼
補足を投稿した後にいろいろと試していて、
formatfileのパスは'''で囲むことでインポートすることができました。
解決できたのもexec ()の事を教えていただいたおかげです
ありがとうございました。
ALTER PROCEDURE [dbo].[test1]
AS
BEGIN
DECLARE @maxseq as int;
DECLARE @str001 as varchar(100);
DECLARE @str002 as varchar(100);
DECLARE @cmdstr as varchar(2000);
DROP TABLE test2
CREATE TABLE test2 ([F1] varchar(max),[F0] int IDENTITY(1,1) NOT NULL)
BULK INSERT dbo.test2
FROM 'c:\test.csv'
WITH
(
firstrow = 2,
formatfile = 'c:\ImportOrg_Fmt2.xml'
);
SET @maxseq = (SELECT max(F0) FROM test2 );
SET @maxseq = @maxseq -1;
set @str001 = 'lastrow = ' + cast(@maxseq as varchar(6));
set @str002 = 'formatfile = ''c:\ImportOrg_Fmt.xml''';
SET @cmdstr =
'BULK INSERT dbo.test_table
FROM "c:\test.csv"
WITH
(
firstrow = 2,
' + @str001 + ',
' + @str002 +'
)';
exec (@cmdstr);
END
質問者
補足
ご回答ありがとうございます。
いただいたアドバイスから、いろいろ試したので
ですが、うまくいっていません。
ALTER PROCEDURE [dbo].[test1]
AS
BEGIN
DECLARE @maxseq as int;
DROP TABLE test2
CREATE TABLE test2 ([F1] varchar(max),[F0] int IDENTITY(1,1) NOT NULL)
BULK INSERT dbo.test2
FROM 'c:\test.csv'
WITH
(
firstrow = 2,
formatfile = 'c:\ImportOrg_Fmt2.xml'
);
SET @maxseq = (SELECT max(F0) FROM test2 );
SET @maxseq = @maxseq -1;
BULK INSERT dbo.test_table
FROM 'c:\test.csv'
WITH
(
firstrow = 2,
lastrow = @maxseq,
formatfile = 'c:\tb_ImportOrg_Fmt2.xml'
);
END
で実行しましたが
メッセージ 102、レベル 15、状態 1、プロシージャ test0、行 24
'@maxseq' 付近に不適切な構文があります。
となりましたので、execを使用してみようと
ALTER PROCEDURE [dbo].[test1]
AS
BEGIN
DECLARE @maxseq as int;
DECLARE @cmdstr as varchar(2000);
DROP TABLE test2
CREATE TABLE test2 ([F1] varchar(max),[F0] int IDENTITY(1,1) NOT NULL)
BULK INSERT dbo.test2
FROM 'c:\test.csv'
WITH
(
firstrow = 2,
formatfile = 'c:\ImportOrg_Fmt2.xml'
);
SET @maxseq = (SELECT max(F0) FROM test2 );
SET @maxseq = @maxseq -1;
SET @cmdstr =
'BULK INSERT dbo.test_table
FROM "c:\test.csv"
WITH
(
firstrow = 2,
lastrow = ' + @maxseq + ',
formatfile = "c:\tb_ImportOrg_Fmt2.xml"
)';
exec (@cmdstr);
END
に変更して実行したところ
FROM "c:\test.csv"
WITH
(
firstrow = 2,
lastrow = ' をデータ型 int に変換できませんでした。
というエラーになりました。
もしかしてlastrow=@maseqを文字列としてセットすればいいのかと思い
ALTER PROCEDURE [dbo].[test1]
AS
BEGIN
DECLARE @maxseq as int;
DECLARE @str001 as varchar(100);
DECLARE @cmdstr as varchar(2000);
DROP TABLE test2
CREATE TABLE test2 ([F1] varchar(max),[F0] int IDENTITY(1,1) NOT NULL)
BULK INSERT dbo.test2
FROM 'c:\test.csv'
WITH
(
firstrow = 2,
formatfile = 'c:\ImportOrg_Fmt2.xml'
);
SET @maxseq = (SELECT max(F0) FROM test2 );
SET @maxseq = @maxseq -1;
set @str001 = 'lastrow = ' + cast(@maxseq as varchar(6));
print @str001;
--ここでlastrow = 2790が表示されます。
SET @cmdstr =
'BULK INSERT dbo.test_table
FROM "c:\test.csv"
WITH
(
firstrow = 2,
' + @str001 + ',
formatfile = "c:\ImportOrg_Fmt.xml"
)';
exec (@cmdstr);
END
で実行したところ
メッセージ 102、レベル 15、状態 1、行 7
'c:\ImportOrg_Fmt.xml' 付近に不適切な構文があります。
となりました。
formatfileのパスの指定部分が違っているのでエラーになっていると思うのですが、
この場合どのように書いたらいいのでしょうか?
お礼
補足を投稿した後にいろいろと試していて、 formatfileのパスは'''で囲むことでインポートすることができました。 解決できたのもexec ()の事を教えていただいたおかげです ありがとうございました。 ALTER PROCEDURE [dbo].[test1] AS BEGIN DECLARE @maxseq as int; DECLARE @str001 as varchar(100); DECLARE @str002 as varchar(100); DECLARE @cmdstr as varchar(2000); DROP TABLE test2 CREATE TABLE test2 ([F1] varchar(max),[F0] int IDENTITY(1,1) NOT NULL) BULK INSERT dbo.test2 FROM 'c:\test.csv' WITH ( firstrow = 2, formatfile = 'c:\ImportOrg_Fmt2.xml' ); SET @maxseq = (SELECT max(F0) FROM test2 ); SET @maxseq = @maxseq -1; set @str001 = 'lastrow = ' + cast(@maxseq as varchar(6)); set @str002 = 'formatfile = ''c:\ImportOrg_Fmt.xml'''; SET @cmdstr = 'BULK INSERT dbo.test_table FROM "c:\test.csv" WITH ( firstrow = 2, ' + @str001 + ', ' + @str002 +' )'; exec (@cmdstr); END
補足
ご回答ありがとうございます。 いただいたアドバイスから、いろいろ試したので ですが、うまくいっていません。 ALTER PROCEDURE [dbo].[test1] AS BEGIN DECLARE @maxseq as int; DROP TABLE test2 CREATE TABLE test2 ([F1] varchar(max),[F0] int IDENTITY(1,1) NOT NULL) BULK INSERT dbo.test2 FROM 'c:\test.csv' WITH ( firstrow = 2, formatfile = 'c:\ImportOrg_Fmt2.xml' ); SET @maxseq = (SELECT max(F0) FROM test2 ); SET @maxseq = @maxseq -1; BULK INSERT dbo.test_table FROM 'c:\test.csv' WITH ( firstrow = 2, lastrow = @maxseq, formatfile = 'c:\tb_ImportOrg_Fmt2.xml' ); END で実行しましたが メッセージ 102、レベル 15、状態 1、プロシージャ test0、行 24 '@maxseq' 付近に不適切な構文があります。 となりましたので、execを使用してみようと ALTER PROCEDURE [dbo].[test1] AS BEGIN DECLARE @maxseq as int; DECLARE @cmdstr as varchar(2000); DROP TABLE test2 CREATE TABLE test2 ([F1] varchar(max),[F0] int IDENTITY(1,1) NOT NULL) BULK INSERT dbo.test2 FROM 'c:\test.csv' WITH ( firstrow = 2, formatfile = 'c:\ImportOrg_Fmt2.xml' ); SET @maxseq = (SELECT max(F0) FROM test2 ); SET @maxseq = @maxseq -1; SET @cmdstr = 'BULK INSERT dbo.test_table FROM "c:\test.csv" WITH ( firstrow = 2, lastrow = ' + @maxseq + ', formatfile = "c:\tb_ImportOrg_Fmt2.xml" )'; exec (@cmdstr); END に変更して実行したところ FROM "c:\test.csv" WITH ( firstrow = 2, lastrow = ' をデータ型 int に変換できませんでした。 というエラーになりました。 もしかしてlastrow=@maseqを文字列としてセットすればいいのかと思い ALTER PROCEDURE [dbo].[test1] AS BEGIN DECLARE @maxseq as int; DECLARE @str001 as varchar(100); DECLARE @cmdstr as varchar(2000); DROP TABLE test2 CREATE TABLE test2 ([F1] varchar(max),[F0] int IDENTITY(1,1) NOT NULL) BULK INSERT dbo.test2 FROM 'c:\test.csv' WITH ( firstrow = 2, formatfile = 'c:\ImportOrg_Fmt2.xml' ); SET @maxseq = (SELECT max(F0) FROM test2 ); SET @maxseq = @maxseq -1; set @str001 = 'lastrow = ' + cast(@maxseq as varchar(6)); print @str001; --ここでlastrow = 2790が表示されます。 SET @cmdstr = 'BULK INSERT dbo.test_table FROM "c:\test.csv" WITH ( firstrow = 2, ' + @str001 + ', formatfile = "c:\ImportOrg_Fmt.xml" )'; exec (@cmdstr); END で実行したところ メッセージ 102、レベル 15、状態 1、行 7 'c:\ImportOrg_Fmt.xml' 付近に不適切な構文があります。 となりました。 formatfileのパスの指定部分が違っているのでエラーになっていると思うのですが、 この場合どのように書いたらいいのでしょうか?