FireDAC,阵列DML,SQL Server和IDENTITY_INSERT

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FireDAC,阵列DML,SQL Server和IDENTITY_INSERT相关的知识,希望对你有一定的参考价值。

我正在尝试使用Firedac阵列DML功能将数据导出到SQL Server。在目标表中,有一个IDENTITY列,我需要为其添加一个明确的值。

但是我的查询失败,并显示以下错误消息:

SQL状态:23000。本机代码:544。消息:[Microsoft] [SQL ServerNative 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时(即不使用Array DML功能时),一切工作正常。但是对于数组DML却失败。

多年来,我也像上面的代码一样,将Array DML用于其他几种DBMS,并获得了成功。

因此,如何使用数组DML功能向SQL Server IDENTITY列插入显式值?

答案

[AFAICT,在FD的ArrayDML中没有魔力。我只是追溯到

FDQuery1.Execute(100, 0)

而且似乎要做的就是

for i := 0 to 99 do
  FDQuery1.ExecSQL

所以,我重复我在评论中说的话:

  1. 让Insert语句在SSMS的Query实用程序中无投诉地执行。如果语法不能100%正确,请在Google周围搜索。

  2. 仅[[之后您在步骤1中成功完成,请尝试使用调用完全相同

    语句FDQuery1.SQL.Text:= [在步骤1中起作用了];

    FDQuery1.Execute(1)

  3. 如果步骤2引发错误,请使用SSMS的探查器来监视您的应用程序发送到服务器的内容。也许它发送的不是您所想的完全。
  4. 如果第3步没有发现任何错误,请尝试使用IF修改IINSERT语句,以便仅在当前IDENTITY_INSERT值的测试不正确时才调用该语句。如有必要,请在TransactSQL文档中进行查找。
  5. 如果仍然不起作用,请添加语句以打开和关闭IDENTITY_INSERT作为FDQuery1的一部分。执行代码,即立即包围实际的INSERT语句。
  6. 询问MS

以上是关于FireDAC,阵列DML,SQL Server和IDENTITY_INSERT的主要内容,如果未能解决你的问题,请参考以下文章

firedac odbc sql server driver连接占线导致另一个hstmt

到T-SQL DML 三级的阶梯:在SQL server中实现关系模型

外文转译:通过楼梯到T-SQL DML等级3:在SQL Server中实现关系模型

SQL Server数据库DML操作

SQL Server如何用触发器捕获DML操作的会话信息

[FireDAC][Phys][MySQL] MySQL server has gone away