我正在努力提高更新的性能。按照其他线程中的建议,我尝试使用
BulkInsert
进入临时表,然后使用 UPDATE... WHERE
加入生产表。
数据本身位于VB.net中的DataTable中,过去我广泛使用
SqlBulkInsert
将数据从DataTable快速加载到SQL Server中。所以我的想法是使用 DbCommand
来运行:
SELECT * INTO ##Projects FROM Projects WHERE 1=0
当我运行该代码时,当我查看 SSMS 时,我可以看到正在创建表(这就是我使用
##
的原因)。本例中的单个数据表条目是:
Name: "test"
Address: "123 Anywhere St.
City: "St. Louis"
完成后,我尝试运行:
Using S As SqlBulkCopy = New SqlBulkCopy(ConStr)
S.DestinationTableName = TableName
S.WriteToServer(DT)
S.Close()
End Using
此操作失败并出现错误
SqlException:无效的对象名称“#Projects”
经过一番尝试后,我将
##
替换为 TEMP
来制作 TEMPProjects
,效果非常好。这是我之前多次使用过的代码。
看看这里的线程,像这个一样,似乎不需要特殊的设置来使用临时表。我很茫然,我是不是错过了什么?
问题是您提供的是连接字符串,而不是打开的连接,因此它将打开自己单独的连接。
该其他连接与其他连接没有关系,因此看不到其本地临时表。如果您关闭了之前的连接,那么所有全局临时表也会被删除。您需要使用相同的连接,而不需要在它们之间关闭。您还需要确保创建临时表的命令不使用参数,否则它将在单独的范围内通过
SqlBulkCopy
进行操作。
sp_executesql