【问题标题】:How to cast variables in T-SQL for bulk insert?如何在 T-SQL 中为批量插入转换变量?
【发布时间】:2011-06-28 11:45:17
【问题描述】:

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

-- Bulk insert data from the .csv file into the staging table.
DECLARE @CSVfile nvarchar(255);
SET @CSVfile = N'T:\x.csv';
BULK INSERT [dbo].[TStagingTable]
-- FROM N'T:\x.csv' -- This line works
FROM @CSVfile -- This line will not work
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
FIRSTROW = 2    
)

错误是:

Incorrect syntax near the keyword 'with'. 

如果我替换:

FROM @CSVfile

与:

FROM 'T:\x.csv'

...然后它工作得很好。

【问题讨论】:

  • 令我惊讶的是,SQL Server 的 BULK INSERT 语法无法接受计算结果为关键字 FROM 之后的 SQL 字符串的表达式。多么随机。
  • 这就是 PostgreSQL 如此出色的原因:像这种奇怪的钝角案例只是得到修复,而不是留在那里溃烂。

标签: sql sql-server-2008


【解决方案1】:

据我所知,from 中只需要文字字符串。在这种情况下,您必须编写动态查询才能使用批量插入

declare @q nvarchar(MAX);
set @q=
    'BULK INSERT [TStagingTable]
    FROM '+char(39)+@CSVfile+char(39)+'
    WITH
    (
    FIELDTERMINATOR = '','',
    ROWTERMINATOR = ''\n'',
    FIRSTROW = 1  
    )'
exec(@q)

【讨论】:

  • 太棒了,只需进行一些修改即可。如果我在查询中使用任何双引号似乎根本不起作用,您的解决方案非常完美。
  • SQL 注入怎么样?
  • 所有答案似乎都忽略了 SQL 注入。有没有办法为批量插入参数化动态SQL?
【解决方案2】:

您尝试过动态 SQL 吗?

SET @SQL = "BULK INSERT TmpStList FROM '"+@PathFileName+"' WITH (FIELDTERMINATOR = '"",""') "

然后

EXEC(@SQL)

参考:http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file

【讨论】:

  • 感谢您抽出宝贵时间回答,非常感谢。
  • SQL 注入怎么样?
  • 没错。当然有一种方法可以使用带有参数的 sp_ExecuteSQL 来做到这一点?
【解决方案3】:

您必须进行字符串构建,然后调用 EXEC() 或 sp_executesql BOL 有一个例子:

DECLARE @bulk_cmd varchar(1000)
SET @bulk_cmd = 'BULK INSERT AdventureWorks2008R2.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>'' 
WITH (ROWTERMINATOR = '''+CHAR(10)+''')'
EXEC(@bulk_cmd)

【讨论】:

  • 感谢您的回答,不胜感激。
  • SQL 注入怎么样?
【解决方案4】:

你可以试试FROM ' + @CSVfile + '

【讨论】:

  • 谢谢,感谢您的宝贵时间。
【解决方案5】:

需要一个字符串文字。

http://msdn.microsoft.com/en-us/library/ms188365.aspx

您可以使用动态 sql 来生成字符串文字。

【讨论】:

    【解决方案6】:

    大多数情况下,我在文件名中查找的变量是日期,这个变量非常适合批量插入带日期的文件,例如在日常工作中使用。根据需要更改日期格式、表名、文件路径、文件名和分隔符。

        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 注入怎么样?
    猜你喜欢
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多