如何为批量插入在T-SQL中强制转换变量?
以下代码给出了一个错误(它是T-SQL存储过程的一部分): 错误是:如何为批量插入在T-SQL中强制转换变量?,sql,sql-server-2008,Sql,Sql Server 2008,以下代码给出了一个错误(它是T-SQL存储过程的一部分): 错误是: Incorrect syntax near the keyword 'with'. 如果我替换: FROM @CSVfile 与: 。。。然后它就很好地工作了。你能从'+@CSVfile+'尝试一下你尝试过动态SQL吗 SET @SQL = "BULK INSERT TmpStList FROM '"+@PathFileName+"' WITH (FIELDTERMINATOR = '"",""') " 然后 EXEC
Incorrect syntax near the keyword 'with'.
如果我替换:
FROM @CSVfile
与:
。。。然后它就很好地工作了。你能从'+@CSVfile+'尝试一下
你尝试过动态SQL吗
SET @SQL = "BULK INSERT TmpStList FROM '"+@PathFileName+"' WITH (FIELDTERMINATOR = '"",""') "
然后
EXEC(@SQL)
参考:需要字符串文本
您可以使用动态sql生成字符串文本。您必须参与字符串构建&然后调用EXEC()或sp_executesql
有一个例子:
DECLARE @bulk_cmd varchar(1000)
SET @bulk_cmd = 'BULK INSERT AdventureWorks2008R2.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = '''+CHAR(10)+''')'
EXEC(@bulk_cmd)
DECLARE@bulk\u cmd varchar(1000)
SET@bulk_cmd='批量插入AdventureWorks2008R2.Sales.SalesOrderDetail
来自“”:\\“”
带(行终止符='''''+CHAR(10)+''')'
EXEC(@bulk\u cmd)
据我所知,from中只需要文本字符串。在这种情况下,您必须编写一个动态查询来使用批量插入
declare @q nvarchar(MAX);
set @q=
'BULK INSERT [TStagingTable]
FROM '+char(39)+@CSVfile+char(39)+'
WITH
(
FIELDTERMINATOR = '','',
ROWTERMINATOR = ''\n'',
FIRSTROW = 1
)'
exec(@q)
大多数情况下,我在文件名中寻找的变量是日期,这一变量非常适合批量插入带有日期的文件,例如在日常工作中使用。根据需要更改日期格式、表名、文件路径、文件名和分隔符
DECLARE @DT VARCHAR (10)
DECLARE @INSERT VARCHAR (1000)
SET @DT = (CONVERT(VARCHAR(10),GETDATE()-1,120))
SET @INSERT = 'BULK INSERT dbo.table FROM ''C:\FOLDER\FILE'+@DT+'.txt'''+' WITH (FIRSTROW=2, FIELDTERMINATOR=''\t'', ROWTERMINATOR=''\n'')'
EXEC (@INSERT);
太棒了,只做了几次修改就成功了。如果我在查询中使用任何双引号似乎都不起作用,您的解决方案非常完美。SQL注入呢?所有答案似乎都忽略了SQL注入。没有办法对批量插入的动态SQL进行参数化吗?谢谢你的回答,非常感谢。SQL注入呢?谢谢你花时间回答,我非常感谢。SQL注入呢?没错。当然有一种方法可以通过使用带有参数的sp_ExecuteSQL来实现这一点吗?谢谢,非常感谢您的时间。SQL注入呢?
declare @q nvarchar(MAX);
set @q=
'BULK INSERT [TStagingTable]
FROM '+char(39)+@CSVfile+char(39)+'
WITH
(
FIELDTERMINATOR = '','',
ROWTERMINATOR = ''\n'',
FIRSTROW = 1
)'
exec(@q)
DECLARE @DT VARCHAR (10)
DECLARE @INSERT VARCHAR (1000)
SET @DT = (CONVERT(VARCHAR(10),GETDATE()-1,120))
SET @INSERT = 'BULK INSERT dbo.table FROM ''C:\FOLDER\FILE'+@DT+'.txt'''+' WITH (FIRSTROW=2, FIELDTERMINATOR=''\t'', ROWTERMINATOR=''\n'')'
EXEC (@INSERT);