Erreur de server SQL: doit déclarer la variable scalaire "@lastrow"

J'ai adapté une requête trouvée en ligne pour importer en vrac des files CSV dans le server SQL. Cependant, mes files CSV ont un saut de ligne de rechange en bas, j'ai donc ajouté un countur pour le nombre de lignes dans le file, puis j'ai défini le paramètre LASTROW dans le BULK INSERT.

Cependant, parce que je suis en boucle sur l'INSULTE EN VRAC, je dois passer le nom de file au countur de lignes. Mais j'obtiens l'erreur "Doit déclarer la variable scalaire" @lastrow "" quand @filllastrow s'exécute. Quelqu'un peut-il aider s'il vous plaît?

Merci

Rob

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 

Utilisez sp_executesql et définissez le paramètre @lastrow tant que paramètre de sortie.

Essayez quelque chose comme ça …

 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 

Mettez 'declare @lastrow int' dans la string @sql, supprimez les conversions de type et exécutez les deux instructions SQL set pour garder @lastrow en cours. Exécutez BULK INSERT dans une fonction EXEC pour lui passer le paramètre. @Filllastrow n'est pas nécessaire:

 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