在Advantage Database Server

时间:2016-08-25 11:24:43

标签: advantage-database-server

我最近接受了使用Advantage Database Server作为后端的系统的支持。在某些背景下,我有多年的数据库经验但直到现在才使用过ADS,所以我的问题纯粹是关于如何在这个特定的DBMS中实现标准模式。

以前开发过的存储过程以这种方式管理ID列:

@ID = (SELECT ISNULL(MAX(ID), 0) FROM ExampleTable);
@ID = @ID + 1;

INSERT INTO Example_Table (ID, OtherStuff)
VALUES (@ID, 'Things');

--Do some other stuff.

UPDATE ExampleTable
SET AnotherColumn = 'FOO'
WHERE ID = @ID;

我的问题是我现在需要多次并行运行此存储过程。可以想象,当我这样做时,相同的ID值会被多次抓取。

我需要的是一种始终如一地创建唯一值的方法,即使我在同一时刻多次运行存储过程,我也可以确定它是唯一的。在SQL Server中,我可以创建一个名为ID的IDENTITY列,然后执行以下操作:

INSERT INTO ExampleTable (OtherStuff)
VALUES ('Things');

SET @ID = SCOPE_IDENTITY(); 

ADS有autoinc这看起来很相似,但是我找不到任何结论性地告诉我如何以一种我可以100%确定在并发使用下正确的方式返回新创建的值的值。 ADS开发人员指南实际上警告我不要使用autoinc,并且在线帮助文​​件提供的函数似乎检索最后生成的autoinc ID(这不是我想要的 - 我想要前一个语句创建的那个,不是在所有会话中创建的最后一个)。帮助文件还列出了这些函数,但需要注意的是它们在涉及并发的情况下可能无法正常工作。

如何在ADS中实现此功能?我应该使用autoinc,其他一些我不知道的内置方法,或者我真正需要按照开发人员指南的建议进行操作,并在尝试插入第一个表之前生成我的唯一标识符地点?如果我应该使用autoinc,我如何获得刚刚插入表中的值?

2 个答案:

答案 0 :(得分:2)

您将LastAutoInc(STATEMENT)autoinc一起使用。

来自documentation(在Advantage SQL->支持的SQL语法 - >支持的标量函数 - >其他)下:

  

LASTAUTOINC(CONNECTION | STATEMENT)

     

从插入或追加返回上次使用的autoinc值。指定CONNECTION将返回整个连接的最后一个使用值。指定STATEMENT仅返回当前SQL语句的上次使用值。如果尚未更新autoinc值,则返回NULL值。

     

注意:对具有autoinc字段的表进行操作的触发器可能会影响上一个autoinc值。

     

注意:SQL脚本触发器在自己的SQL语句上运行。因此,在SQL脚本触发器内调用LASTAUTOINC(STATEMENT)将返回触发器的SQL语句使用的lastautoinc值,而不是导致触发器触发的原始​​SQL语句。要获取最后一个原始SQL语句的lastautoinc值,请改用LASTAUTOINC(CONNECTION)。

     

示例:从System.Iota中选择LASTAUTOINC(STATEMENT)

答案 1 :(得分:0)

另一种选择是使用GUID。

(我不确定,但是当你说时你可能已经在暗示这一点,或者我真的需要像开发人员的指南那样做,并在尝试插入表格之前生成我的唯一标识符首先。“ - 如果是这样道歉,但这些信息对其他人可能仍然有用:))

使用GUID作为代理键允许应用程序或数据库使用a guarantee of no clashes创建唯一标识符。

Advantage 12内置支持GUID数据类型:

  

GUID和64位整数字段类型

     

Advantage服务器和客户端现在支持所有表格格式的GUID和Long Integer(64位)数据类型。 64位整数类型可用于存储-9,223,372,036,854,775,807和9,223,372,036,854,775,807之间的整数值,而不会损失精度。 GUID(全局唯一标识符)字段类型是16字节的数据结构。表达式引擎和SQL引擎中提供了一个新的标量函数NewID()来生成新的GUID。有关详细信息,请参阅ADT字段类型和规格以及DBF字段类型和规范。

     

http://scn.sap.com/docs/DOC-68484

对于早期版本,您可以将GUID存储为char(36)。 (当然,请考虑您的performance要求。)然后,您需要在GUID和字符串之间的应用层中来回转换。如果您正在使用某些中间数据访问层,例如NHibernate或Entity Framework,您应该能够至少将转换本地化到一个地方。

如果逻辑的某些部分在存储过程中,您应该能够使用newid()newidstring()函数,具体取决于支持列的类型:

INSERT INTO Example_Table (newid(), OtherStuff)