我尝试创建要从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
有任何解释吗?
答案 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'