批量插入文件路径作为存储过程参数

时间:2014-10-24 20:58:24

标签: sql-server tsql stored-procedures sql-server-2012 bulkinsert

我尝试创建要从CSV导入的存储过程。如果我有一个硬编码的文件路径,一切都有效,但我想把文件路径作为参数。当我尝试SQL Sever Management Studio时会生成错误:

  

' @ filePath'附近的语法不正确。

(事实上,如果我放一个纯字符串(例如。'C:'+'/dir'),它就会出错。)

这是我的代码的简化版本:

Create procedure [importFile](@filePath varchar(Max))
AS
BEGIN
    create table #Temp
    (
      row1 int,
      row2 varchar(5),
      row3 bit
    )
    BULK insert
      #Temp
      from @filePath
      With(
        FIELDTERMINATOR = ',',
        ROWTERMINATOR = '\n'
      )
    ...
END

有任何解释吗?

1 个答案:

答案 0 :(得分:3)

使用动态SQL将文件名变量注入到包含批量插入语句的字符串中,并使用sp_executesql来执行它。您可能希望添加一些错误检查以检查路径是否有效等等。

CREATE PROCEDURE [importFile] (@filePath VARCHAR(MAX))
AS
BEGIN
    CREATE TABLE #Temp
    (
      row1 int,
      row2 varchar(5),
      row3 bit
    )

    DECLARE @SQL NVARCHAR(MAX) = ''
    SET @SQL = N'
    BULK INSERT #Temp
      FROM ''' + @filePath + '''
      WITH (
        FIELDTERMINATOR = '','',
        ROWTERMINATOR = ''\n''
      )'

     -- ...

     EXEC sp_executesql @SQL
END

-- to run it:
EXEC importFile 'd:\test.csv'