Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 插入SELECT-大量记录_Sql_Sql Server_Tsql_Insert - Fatal编程技术网

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中更新。它可以提高性能,也可以脱机完成。插入操作在一个数据库中完成一批这个解决方案不起作用,它不是在队列中插入一个表。是的,但是如果主插入是一次性完成的,您什么时候会这样做