我有一些这样的代码,用于将数据文件批量插入到表中,其中数据文件和表名是变量:
DECLARE @sql AS NVARCHAR(1000)
SET @sql = 'BULK INSERT ' + @tableName + ' FROM ''' + @filename + ''' WITH (CODEPAGE=''ACP'', FIELDTERMINATOR=''|'')'
EXEC (@sql)
这适用于标准表,但现在我需要做同样的事情来将数据加载到临时表中(例如,#MyTable
)。但是当我尝试这个时,我得到了错误:
Invalid Object Name: #MyTable
我认为问题是由于该BULK INSERT
语句是动态构建然后使用执行的EXEC
,并且在调用#MyTable
的上下文中无法访问。EXEC
我需要构造这样的BULK INSERT
语句的原因是我需要将文件名插入到语句中,这似乎是唯一的方法。所以,似乎我可以有一个变量文件名,或者使用一个临时表,但不能同时使用两者。
有没有另一种方法来实现这一点 - 也许通过使用OPENROWSET(BULK...)
?
更新: 好的,所以我听到的是 BULK INSERT 和临时表对我不起作用。感谢您的建议,但在我的情况下,将我的更多代码移动到动态 SQL 部分是不切实际的。
尝试过OPENROWSET(BULK...)
,似乎遇到了同样的问题,即它无法处理变量文件名,我需要像以前一样动态地构造 SQL 语句(因此无法访问临时表)。
所以,这让我只有一个选择,即使用非临时表并以不同的方式实现进程隔离(通过确保任何时候只有一个进程可以使用这些表 - 我可以想到几种方法来去做)。
它很烦人。按照我原本打算的方式来做会方便得多。只是其中一件应该是微不足道的事情,但最终会浪费你一整天的时间......