存储过程SQL SERVER

时间:2018-04-24 09:25:36

标签: sql sql-server sql-server-2008

您好我想要使用批量插入,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'
     )

2 个答案:

答案 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