Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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 server 强制设置标识\u插入从MS Access更快生效_Sql Server_Ms Access_Odbc_Identity Insert_Upsizing - Fatal编程技术网

Sql server 强制设置标识\u插入从MS Access更快生效

Sql server 强制设置标识\u插入从MS Access更快生效,sql-server,ms-access,odbc,identity-insert,upsizing,Sql Server,Ms Access,Odbc,Identity Insert,Upsizing,我正在将一套MS Access后端数据库升级到SQL Server。我编写了SQL脚本以在SQL Server中创建表模式。现在我正在尝试填充这些表。大多数表都有自动编号主键。以下是我的一般做法: For each TblName in LinkedTableNames 'Create linked table "temp_From" that links to the existing mdb' 'Create linked table "temp_To" that links

我正在将一套MS Access后端数据库升级到SQL Server。我编写了SQL脚本以在SQL Server中创建表模式。现在我正在尝试填充这些表。大多数表都有自动编号主键。以下是我的一般做法:

For each TblName in LinkedTableNames
    'Create linked table "temp_From" that links to the existing mdb'
    'Create linked table "temp_To" that links to the new SQL server table
    ExecutePassThru "SET IDENTITY_INSERT " & TblName & " ON"
    db.Execute "INSERT INTO temp_To SELECT * FROM temp_From", dbFailOnError
    ExecutePassThru "SET IDENTITY_INSERT " & TblName & " OFF"
Next TblName
第一次插入立即发生。后续插入尝试失败,错误为:“当identity\U insert设置为OFF时,无法在表“TblName”中插入identity列的显式值。”

我为那个特定的错误添加了一个恢复语句和一个计时器。结果表明,错误持续了整整600秒(十分钟),然后插入成功

MS Access是否每10分钟自动刷新其ODBC会话?有没有办法迫使这种情况更快发生?我是否遗漏了一些明显的东西

立即想说“使用升迁向导”的人的背景信息:

我没有使用内置的升迁向导,因为我需要能够从头到尾编写整个操作的脚本。我们的目标是在客户端执行切换之前在测试环境中运行它。

有两种想法,但不确定其中一种是否有用,因为这对我来说并不熟悉

“MS Access是否每10分钟自动刷新一次ODBC会话?是否有办法加快刷新速度?我是否遗漏了一些明显的内容?”

在“Access 2003选项”对话框的“高级”选项卡上,有“ODBC刷新间隔”的设置以及重试设置。调整这些有帮助吗。。。或者有任何影响

我想知道您是否可以通过将SQL Server列创建为普通数字而不是自动编号来避免此问题,插入数据,然后更改表。。。ALTER COLUMN可在插入数据后对其进行更改


如果表中包含数据,Access不允许我将数字列转换为自动编号,但ISTR SQL Server在这方面更灵活

我找到了第一个问题的答案。“十分钟”是注册表中喷气发动机键下的一个设置:

'Jet WinXP/ Win7 32-bit:'
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\ODBC\ConnectionTimeout

'Jet Win7 64-bit:'
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\ODBC\ConnectionTimeout

'ACE WinXP/ Win7 32-bit:'
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Access Connectivity Engine\Engines\ODBC\ConnectionTimeout

'ACE Win7 64-bit:'
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MicrosoftAccess Connectivity Engine\Engines\ODBC\ConnectionTimeout
这是针对ACE的:

ConnectionTimeout:缓存连接在超时之前可以保持空闲的秒数。默认值为600(值为REG_DWORD类型)

该键被设置为默认值600。那是600秒或10分钟。我把时间缩短到10秒,代码也相应地加快了速度

这决不是完整的解决方案,因为将默认值设置为low肯定会在其他地方引起问题。事实上,当使用DSN较少的连接时,默认值可能会增加

我仍然希望找到我问题的第二部分的答案,也就是说,有没有办法迫使刷新更快地发生


更新:之所以需要这样做,是因为链接表使用的会话与ADO传递查询不同。我使用SQL分析器运行了一个测试。以下是一些简要的结果:

TextData                               SPID
-------------------------------------------
SET IDENTITY_INSERT dbo.TblName ON       50
SET IDENTITY_INSERT "dbo"."TblName" ON   49
exec sp_executesql N'INSERT INTO "d...   49
SET IDENTITY_INSERT dbo.TblName OFF      50
SET IDENTITY_INSERT dbo.NextTbl ON       50
SET IDENTITY_INSERT "dbo"."NextTbl" ON   49
exec sp_executesql N'INSERT INTO "d...   49
这里的情况是,我的ADO命令运行在与链接表(#50)不同的会话(#49)中。Access看到我正在为标识列设置值,因此它可以帮助为该表设置identity\u INSERT ON。但是,它从不关闭IDENTITY_INSERT。我手动关闭它,但这是在另一个会话中发生的


这解释了为什么将ODBC会话超时设置为较低。这只是一个丑陋的解决办法,因为Access在打开表时从不关闭表上的IDENTITY_INSERT。由于IDENTITY_INSERT是特定于会话的,因此创建新会话就像点击IDENTITY_INSERT上的重置按钮一样。Access然后可以在下一张桌子上打开它,设置将生效,因为这是一个全新的会话。

+1两个好主意。我没有尝试第一个建议,因为我在注册表中找到了我想要的设置(我将添加它作为一个单独的答案)。第二种方法是直接使用SQLServerMgmtStudio,但这隐藏了所需的内在低效性。它实际上包括将所有记录复制到临时表(使用SET IDENTITY_INSERT ON/OFF)、删除原始表以及将临时表重命名为原始表。我的一个表有200多万条记录,所以我想避免这种低效。