2017-01-13 10 views
2

SQLサーバーにCSVファイルを一括インポートするためにオンラインで検索されたクエリを採用しました。しかし、私のCSVには余分な行送りがあるので、ファイルの行数にカウンタを追加し、BULK INSERTにLASTROWパラメータを設定しました。SQLサーバーエラー:スカラー変数 "@lastrow"を宣言する必要があります

しかし、私はBULK INSERTをループしているので、ファイル名を行カウンタに渡す必要があります。しかし、@filllastrowが実行されるときにエラー "スカラー変数" @lastrow "を宣言しなければなりません。誰でも助けてくれますか?

おかげ

ロブ

 declare @filename varchar(255), 
     @path  varchar(255), 
     @sql  varchar(8000), 
     @filllastrow  varchar(8000), 
     @cmd  varchar(1000) 

declare c1 cursor for SELECT WHICHPATH,WHICHFILE FROM ALLFILENAMES where WHICHFILE like '%.csv%' 
open c1 
fetch next from c1 into @path,@filename 
While @@fetch_status <> -1 
begin 
    declare @lastrow varchar(10) 
    set @filllastrow = 'set @lastrow = convert(varchar(10),(SELECT count(*) FROM OPENROWSET(BULK '''+ @path + @filename+''', FORMATFILE = ''E:\ereferrals\MyFormat_Counting.fmt'', MAXERRORS=10) AS a) - 1)' 
    print @filllastrow 
    exec (@filllastrow) 

set @sql = 'BULK INSERT eref FROM ''' + @path + @filename + ''' ' 
     + '  WITH ( 
       FIELDTERMINATOR = '','', 
       ROWTERMINATOR = ''0x0A'', 
       FIRSTROW = 2 , 
       LASTROW = '+convert(varchar,@lastrow)+', 
       ERRORFILE = ''e:\ereferrals\probs.log'' 
      ) ' 
print @sql 
EXECUTE @sql 
fetch next from c1 into @path,@filename 
end 
close c1 
deallocate c1 

答えて

0

使用sp_executesqlと出力パラメータとして@lastrowパラメータを定義します。

このような何かを試してみてください...

declare @filename  nvarchar(255) 
     ,@path   nvarchar(255) 
     ,@sql   nvarchar(MAX) --<-- Correct datatype 
     ,@filllastrow nvarchar(MAX) --<-- Correct datatype 
     ,@cmd   nvarchar(1000) 


declare c1 cursor for 
SELECT WHICHPATH , WHICHFILE 
FROM ALLFILENAMES 
where WHICHFILE like '%.csv%' 

open c1 

fetch next from c1 into @path,@filename 


While @@fetch_status <> -1 
begin 
    declare @lastrow INT; 

    set @filllastrow = 'SELECT @lastrow = convert(varchar(10), ISNULL(count(*),2) -1) 
         FROM OPENROWSET(BULK '''+ @path + @filename+''' 
             , FORMATFILE = ''E:\ereferrals\MyFormat_Counting.fmt'' 
             , MAXERRORS=10) AS a)' 


    Exec sp_executesql @filllastrow 
         ,N'@lastrow INT OUTPUT' --<-- Output parameter 
         ,@lastrow OUTPUT         

set @sql = 'BULK INSERT eref FROM ''' + @path + @filename + ''' ' 
     + '  WITH ( 
       FIELDTERMINATOR = '','', 
       ROWTERMINATOR = ''0x0A'', 
       FIRSTROW = 2 , 
       LASTROW = @lastrow, 
       ERRORFILE = ''e:\ereferrals\probs.log'' 
      ) ' 

    Exec sp_executesql @sql 
        ,N'@lastrow INT' 
        ,@lastrow 

fetch next from c1 into @path,@filename 
end 
close c1 
deallocate c1 
+0

ありがとうございました。 "MAXERRORS = 10)"の後にスペアブラケットを削除してからエラーを返します。 メッセージ102、レベル15、状態1、行5 '@lastrow'の近くに構文が正しくありません。 –

0

入れ、@sql文字列に「@lastrow int型を宣言」型変換を削除し、@lastrow電流を維持するために一緒に両方のSQL文を実行します。 EXEC関数でBULK INSERTを実行してパラメータを渡します。 @Filllastrow不要:

declare @filename varchar(255), 
     @path  varchar(255), 
     @sql  varchar(8000), 
     @cmd  varchar(1000) 

declare c1 cursor for SELECT WHICHPATH,WHICHFILE FROM ALLFILENAMES 
         where WHICHFILE like '%.csv%' 
open c1 
fetch next from c1 into @path,@filename 
While @@fetch_status <> -1 
begin 
    set @sql = ' declare @lastrow as int set @lastrow = 
     (SELECT count(*) 
     FROM OPENROWSET(BULK '''+ @path + @filename+''', FORMATFILE = 
     ''E:\ereferrals\MyFormat_Counting.fmt'', MAXERRORS=10) AS a) - 1 
     EXEC(''BULK INSERT eref FROM ''''' + @path + @filename + ''''' ' 
     + '  WITH ( 
       FIELDTERMINATOR = '''','''', 
       ROWTERMINATOR = ''''0x0A'''', 
       FIRSTROW = 2 , 
       LASTROW = '' + @lastrow + '', 
       ERRORFILE = ''''e:\ereferrals\probs.log'''' 
      ) ' 
print @sql 
EXECUTE @sql 
fetch next from c1 into @path,@filename 
end 
close c1 
deallocate c1 
+0

ありがとうございます。私はそれを試して、エラーメッセージ 'declare @lastrow ....)'は有効な識別子ではありません。 問題は、一括挿入が変数をLASTROWパラメータとして受け入れることができないことだと思います。 –

+0

@RobShaw_UK lastrowを整数として宣言するように更新しました.--これを修正して、誤字を修正しました。 – cloudsafe

+0

ありがとうございますが、私はまだ同じエラーが発生します。私が印刷@ sqlからのテキストをそれ自身で実行すると、「@lastrowの近くの構文が間違っています。」 –

関連する問題