Sql server SQL server错误:必须声明标量变量“@lastrow”

Sql server SQL server错误:必须声明标量变量“@lastrow”,sql-server,bulkinsert,declare,Sql Server,Bulkinsert,Declare,我修改了一个在线查询,将CSV文件批量导入SQL server。但是,我的CSV在底部有一个备用换行符,因此我为文件中的行数添加了一个计数器,然后在大容量插入中设置LASTROW参数 但是,因为我正在循环大容量插入,所以需要将文件名传递给行计数器。但我得到的错误是,当@filllastrow执行时,必须声明标量变量@lastrow。有人能帮忙吗 谢谢 抢劫 使用sp_executesql并将@lastrow参数定义为输出参数 试试这样的 declare @filename nvarc

我修改了一个在线查询,将CSV文件批量导入SQL server。但是,我的CSV在底部有一个备用换行符,因此我为文件中的行数添加了一个计数器,然后在大容量插入中设置LASTROW参数

但是,因为我正在循环大容量插入,所以需要将文件名传递给行计数器。但我得到的错误是,当@filllastrow执行时,必须声明标量变量@lastrow。有人能帮忙吗

谢谢

抢劫

使用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

将“declare@lastrow int”放在@sql字符串中,删除类型转换并同时运行这两个sql语句以保持@lastrow为最新。在EXEC函数中运行bulkinsert以向其传递参数@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

谢谢我试过了,得到了一条错误消息“declare@lastrow…”不是有效的标识符。我认为问题在于大容量插入无法接受变量作为LASTROW参数。@RobShaw_UK我更新后将LASTROW声明为整数。-刚刚再次更新以更正键入错误。谢谢,但我仍然收到相同的错误。如果我自己运行print@sql中的文本,我会在“@lastrow”附近得到不正确的语法。@RobShaw_UK BULK INSERT无法传递参数,因此我修改了代码以动态运行它。谢谢。我删除了MAXERRORS=10之后的备用括号,它在“@lastrow”附近给出了错误消息102,级别15,状态1,第5行错误语法。
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