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

Meg*_*Tom 5 t-sql sql-server stored-procedures bulkinsert sql-server-2012

我正在尝试创建一个存储过程以从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
Run Code Online (Sandbox Code Playgroud)

有什么解释吗?

jpw*_*jpw 7

使用动态 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'
Run Code Online (Sandbox Code Playgroud)