您好我想要使用批量插入,csv文件和存储过程插入数据, 我的问题是当我使用参数而不是csv文件的路径时,当我更改参数的路径时,我得到下一个错误
Msg 102,Level 15,State 1,Procedure carga_masiva,Line 7 [Batch 开始第7行]' @ ruta'附近的语法错误。 Msg 319,Level 15,State 1,程序carga_masiva,第7行[批处理开始第7行]不正确 关键字'附近的语法'。如果此语句是公用表 表达式,xmlnamespaces子句或更改跟踪上下文 子句,前一个语句必须以分号结束。
这是我的存储过程:
USE [prueba]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[carga_masiva]
--Parametros que utilizara el procedimiento almacenado
@ruta nvarchar(250)
AS
--Query que realizara el procedimiento almacenado
SET NOCOUNT ON;
BULK INSERT USUARIO
FROM @ruta
WITH
(
FIELDTERMINATOR= ';',
ROWTERMINATOR = '\n'
)
答案 0 :(得分:0)
尝试这应该工作:
ALTER PROCEDURE [dbo].[carga_masiva] @ruta nvarchar(250) AS
DECLARE @bulkinsert NVARCHAR(2000), @filepath nvarchar(500)
SET @filepath = @ruta
SET
NOCOUNT ON;
SET @bulkinsert =
N'BULK INSERT USUARIO FROM ''' +
@filepath +
N''' WITH ( FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'')'
EXEC sp_executesql @bulkinsert
您可以考虑将BULK INSERT语句构建为字符串,然后将其作为动态SQL执行。
答案 1 :(得分:0)
我认为问题可能是您要插入的问题,因为它希望将某个位置作为字符串,例如' C:\文件'而不是C:\ Doc。
动态SQL将是一种选择,例如。
USE [prueba];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
ALTER PROCEDURE [dbo].[carga_masiva]
--Parametros que utilizara el procedimiento almacenado
@ruta NVARCHAR(250)
AS
--Query que realizara el procedimiento almacenado
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(1024);
SET @SQL = '
BULK INSERT USUARIO
FROM '+CHAR(39)+@ruta+CHAR(39)+'
WITH
(
FIELDTERMINATOR= '';'',
ROWTERMINATOR = ''\n''
)
';
EXEC sp_executesql
@SQL;
Pinal Dave在这里有一个方便的帖子:https://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server/
MS文档位于:https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-2017