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)
有什么解释吗?
使用动态 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)