Sql 插入SELECT-大量记录
我想把记录插入一个诱人的文件中。大概是这样的:Sql 插入SELECT-大量记录,sql,sql-server,tsql,insert,Sql,Sql Server,Tsql,Insert,我想把记录插入一个诱人的文件中。大概是这样的: insert into ##tempT SELECT * FROM MyTable MyTable包含大量记录,因此插入需要很长时间 如果我尝试运行: SELECT COUNT(*) FROM ##tempT 在通过INSERT INTO命令插入MyTable中的所有记录之前,它始终返回0 我怎样才能得到一个进度计数,告诉我有多少记录在诱惑中 我需要在SQL命令运行时更新进度条值 谢谢。试试看 set transaction isolatio
insert into ##tempT
SELECT * FROM MyTable
MyTable包含大量记录,因此插入需要很长时间
如果我尝试运行:
SELECT COUNT(*) FROM ##tempT
在通过INSERT INTO命令插入MyTable中的所有记录之前,它始终返回0
我怎样才能得到一个进度计数,告诉我有多少记录在诱惑中
我需要在SQL命令运行时更新进度条值
谢谢。试试看
set transaction isolation level read uncommitted
SELECT COUNT(*) FROM ##tempT
您可以拆分查询
x = number of records in MyTable / 100
i = 0
do until we're done
queryString = "insert into ##tempT "
queryString += "select top " + x " + " * FROM MyTable "
queryString += "where RecordNumber > " + i
Execute queryString
Update Progress Bar
i = i + x
loop
您会注意到,您需要某种RecordNumber字段来实现这一功能。您可以通过多种方式进行搜索。使用存储过程并声明变量计数,并将其视为循环变量,每次插入时,将计数增加1,并随时使用另一个查询打印。或者,从过程中返回此计数,并将其读入程序以更新进度条: 好的一点,或者更好的一点:从使用nolock的诱惑中选择count*,以避免影响连接状态。read uncommitted和nolock都可以在您的场景中工作。但是,它们都是危险的武器,所以不要在数据操纵场景中使用它们进度条是可以的。好的,我只是尝试使用with nolock方法来查看我运行的insert语句插入了大约2600万行的距离。即使使用nolock,每次都返回为0。您是如何进行此测试的?尝试在SSMS中的一个选项卡上运行insert,并在另一个选项卡上运行计数。我刚才做了一个测试,以确定sureBen的解决方案。对Diego答案的评论可能最适合您的特定场景。当你被限制在一个线程中,并且该线程正在进行DB更新和GUI反馈时,我的解决方案要好得多,就像我们在vb6时代通常要做的那样。对于今天的标准来说,这是一个糟糕的解决方案。@JotaBe好吧,这伤害了我的感情。很抱歉,我的回答没有让您满意。出于好奇,您为什么要将数据插入临时表?您还可以将其记录在队列中,然后将其作为事务推送到DB表中,以防您不需要立即在Tentable中更新。它可以提高性能,也可以脱机完成。插入操作在一个数据库中完成一批这个解决方案不起作用,它不是在队列中插入一个表。是的,但是如果主插入是一次性完成的,您什么时候会这样做