Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Inserção em massa usando procedimento armazenado


Não há nada de errado com seu código de procedimento armazenado - o ponto é:o BULK INSERT O comando não pode aceitar um nome de arquivo como uma variável.

Isso funciona:
BULK INSERT ZIPCodes 
FROM  'e:\5-digit Commercial.csv' 
WITH 

mas isso nunca funciona - dentro de um proc armazenado ou não:
DECLARE @filename VARCHAR(255)
SET @filename = 'e:\5-digit Commercial.csv' 

BULK INSERT ZIPCodes 
FROM @filename
WITH 

Então você simplesmente não pode fazer isso dessa maneira, infelizmente. Você pode considerar construir seu BULK INSERT declaração como uma string (com um nome de arquivo fixo) e, em seguida, executá-lo como SQL dinâmico - mas eu realmente não vejo nenhuma outra solução.
DECLARE @filepath nvarchar(500)
SET @filepath = N'e:\5-digit Commercial.csv'

DECLARE @bulkinsert NVARCHAR(2000)

SET @bulkinsert = 
       N'BULK INSERT ZIPCodes FROM ''' + 
       @filepath + 
       N''' WITH (FIRSTROW = 2, FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'')'

EXEC sp_executesql @bulkinsert