如何为批量插入在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

以下代码给出了一个错误(它是T-SQL存储过程的一部分):

错误是:

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);