【发布时间】:2019-10-27 16:19:42
【问题描述】:
我正在尝试使用 Firedac 阵列 DML 功能将数据导出到 SQL Server。在目标表中,有一个 IDENTITY 列,我需要为其添加一个显式值。
但我的查询失败并显示以下错误消息:
SQL 状态:23000。本机代码:544。消息:[Microsoft][SQL Server Native Client 11.0][SQL Server]无法插入显式值 当 IDENTITY_INSERT 设置为时,表 'dic_cities' 中的标识列 关闭。
目标表定义如下:
CREATE TABLE dbo.dic_cities (
id int IDENTITY(1,1) PRIMARY KEY,
city_name varchar(50) NOT NULL
)
我的代码:
MyFDQuery.Connection.ExecSQL('SET IDENTITY_INSERT dbo.dic_cities ON');
MyFDQuery.SQL.Text := 'INSERT INTO dbo.dic_cities (id, city_name) VALUES (:id, :city_name)';
//Populating parameters and preparing the query
{...}
//Execute Array DML query with batch size of 100
MyFDQuery.Execute(100, 0);
//Finally, set IDENTITY_INSERT off for the destination table
MyFDQuery.Connection.ExecSQL('SET IDENTITY_INSERT dbo.dic_cities OFF');
我必须注意,当我使用带有参数的常规 TFDQuery 时(即不使用数组 DML 功能时),一切正常。但 Array DML 失败。
多年来,我还以类似于上面的代码的方式将 Array DML 用于其他几个 DBMS,并取得了成功。
那么,如何使用 Array DML 功能将显式值插入 SQL Server IDENTITY 列?
【问题讨论】:
-
抛开 Array dML,您能否通过检索 FDQuery 的
OnNewRecord事件中的下一个 Identity 值成功地将行插入到表中? -
@MartynA 不,我没有尝试过那个活动。而且我可以在没有 Array DML 的情况下轻松管理事情。但出于导出速度的原因,我需要 Array DML。
-
好吧,如果您的问题只是抱怨语法错误的问题,请在 Sql Server Management Studio 的查询实用程序中尝试您的 INSERT 语句。
-
@MartynA 不。我的问题是如何使用数组 DML 将显式值插入 SQL Server IDENTITY 列。我更新了我的问题以避免误解。
-
您是否使用过 SSMS 的分析器来确切地查看服务器反对的内容,以及为什么 SET_IDENTITY 设置显然不是您指定的 ExecSQL?如果您通过使用 IF 使 INSERT 语句依赖于其当前值来测试 SET_IDENTITY 值怎么办?
标签: sql-server-2008 delphi delphi-xe7 firedac