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