【问题标题】:Bulk INSERT Tbl From @path从 @path 批量插入 Tbl
【发布时间】:2021-06-09 22:06:26
【问题描述】:

我想使用循环遍历数百个文件的循环进行批量插入。 但我似乎无法使用变量作为 FROM 路径。 我可以使用 FROM @PATH3 还是有其他方法可以批量插入许多文本文件? 谢谢

Begin
declare @days as varchar(2) = '06'
declare @path1 varchar(28) ='E:\WorkingTkr Data\_GDPD_02-'
declare @path2 varchar(9) ='-2020.trk'
declare @path3 varchar(40) = @path1+@days+@path2
--print (@path3)
bulk insert [dbo].[GDPD_Trk]
from @path3
WITH 
  (
    FIELDTERMINATOR = ' ', 
    ROWTERMINATOR = '\n' 
  )
  End

【问题讨论】:

  • 你的数据库引擎是什么?你试过动态sql吗?
  • 很抱歉,我正在使用 MSSM Studio 访问 SQL 2012 数据库。我确实尝试了一个失败的动态查询。

标签: sql-server tsql variables bulkinsert


【解决方案1】:

尝试使用动态 sql,如下所示:

BEGIN
  declare @days as varchar(2) = '06'
  declare @path1 varchar(28) ='E:\WorkingTkr Data\_GDPD_02-'
  declare @path2 varchar(9) ='-2020.trk'
  declare @path3 varchar(40) = @path1+@days+@path2
          
  declare @sqlBulk varchar(max) = 
'bulk insert [dbo].[GDPD_Trk] ' + char(13) +
'from ''' + @path3 + '''' + char(13) + 
'with' + char(13) +
'(' + char(13) +
'  FIELDTERMINATOR = '' '',' + char(13) +  
'  ROWTERMINATOR = ''\n''' + char(13) +
')'
        
  exec (@sqlBulk)
END

【讨论】:

  • 我收到此错误:消息 102,级别 15,状态 1,第 7 行 '=' 附近的语法不正确。 Msg 137, Level 15, State 2, Line 15 必须声明标量变量“@sqlBulk”。
  • 当我尝试这个时,我收到一个不同的错误:```Begin declare @days as varchar(2) = '06' declare @path1 varchar(28) ='E:\WorkingTkr Data_GDPD_02-'声明@path2 varchar(9) ='-2020.trk' 声明@path3 varchar(40) = @path1+@days+@path2 声明@SQL NVARCHAR(MAX); --print (@path3) Set @SQL = 'bulk insert [dbo].[GDPD_Trk] from ' + @path3 + ' WITH ( FIELDTERMINATOR = '' '', ROWTERMINATOR = ''\n'' )' exec(@ SQL) 结束 '''
  • 错误:消息 102,级别 15,状态 1,第 2 行 'E:' 附近的语法不正确。消息 319,级别 15,状态 1,第 3 行关键字“with”附近的语法不正确。如果这个语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。
  • 我无法测试,但在 @path 变量上取消引号是一个问题。现在可以试试吗?
  • 我也忘了包含 @sqlBulk ?‍♂️ 的数据类型。立即尝试,它必须有效。你现在只需要在你的文件上循环你的日子。我已更改动态查询以使其看起来更好。
【解决方案2】:

非常感谢@Jaime!这就是我用 While 循环结束的内容。

declare @Count INT = 1
  declare @days as varchar(2)
  declare @path1 varchar(28) ='E:\WorkingTkr_Data\_JCSO_06-'
  declare @path2 varchar(9) ='-2021.trk'
 WHILE (@Count <32)
 BEGIN
 IF @Count<10
Begin
  set @days = '0'+convert(varchar,@Count)
  SET @Count = @Count + 1
End
Else
begin
  set @days = convert(varchar,@Count)
  SET @Count = @Count + 1
end
  declare @path3 varchar(40) = @path1+@days+@path2
          
  declare @sqlBulk varchar(max) = 
'bulk insert [dbo].[Trk_HeatMap] ' + char(13) +
'from ''' + @path3 + '''' + char(13) + 
'with' + char(13) +
'(' + char(13) +
'  FIELDTERMINATOR = '' '',' + char(13) +  
'  ROWTERMINATOR = ''\n''' + char(13) +
')'
        
  exec (@sqlBulk)
END

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多