1

设想:

名为“Test”的 Sql Server 2012 表有两个字段。“CounterNo”和“Value”都是整数。

定义了 4 个序列对象,分别命名为 sq1、sq2、sq3、sq4

我想在插入上做这些:

  • 如果 CounterNo = 1则 Value = sq1的下一个值
  • 如果 CounterNo = 2则 Value = sq2的下一个值
  • 如果 CounterNo = 3则 Value = sq3的下一个值

我认为,创建一个自定义函数将其分配为 Value 字段的默认值。但是当我尝试自定义函数时,不支持“序列对象的下一个值”

另一种方法是使用触发器。该表已经触发。

对插入使用存储过程是最好的方法。但是 EntityFramework 5 Code-First 不支持它。

你能建议我实现这一目标的方法吗?

(如果你告诉我如何使用自定义函数来完成它,你也可以在这里发布它。这是我的另一个问题。)

更新: 实际上,该表中有 23 个字段,并且还设置了主键,我正在使用“计数器表”在软件端生成此计数器值。在客户端生成计数器值并不好。

我使用 4 个序列对象作为计数器,因为它们代表不同类型的记录。

如果我同时在同一记录上使用 4 个计数器,它们都会生成下一个值。我只希望相关计数器生成它的下一个值,而其他计数器保持不变。

4

3 回答 3

1

如果我完全理解您的用例,我不确定,但也许以下示例说明了您的需求。

Create Table Vouchers (
    Id              uniqueidentifier    Not Null Default NewId()
    , Discriminator varchar(100)        Not Null
    , VoucherNumber int                 Null
    -- ...
    , MoreData      nvarchar(100)       Null
);
go
Create Sequence InvoiceSequence AS int Start With 1 Increment By 1;
Create Sequence OrderSequence AS int Start With 1 Increment By 1;
go
Create Trigger TR_Voucher_Insert_VoucherNumer On Vouchers After Insert As 
   If Exists (Select 1 From inserted Where Discriminator = 'Invoice')
     Update v
        Set VoucherNumber = Next Value For InvoiceSequence
        From Vouchers v Inner Join inserted i On (v.Id = i.Id)
        Where i.Discriminator = 'Invoice';
   If Exists (Select 1 From inserted Where Discriminator = 'Order')
     Update v
        Set VoucherNumber = Next Value For OrderSequence
        From Vouchers v Inner Join inserted i On (v.Id = i.Id)
        Where i.Discriminator = 'Order';
go

Insert Into Vouchers (Discriminator, MoreData) 
Values ('Invoice', 'Much')
    ,  ('Invoice', 'More')
    ,  ('Order', 'Data')
    ,  ('Invoice', 'And')
    ,  ('Order', 'Again')
;
go

Select * From Vouchers;

现在发票号和订单号将独立增加。由于您可以在同一个表上拥有多个插入触发器,因此这应该不是问题。

于 2017-02-07T23:48:17.883 回答
0

如果您有四种不同类型的记录,请使用四个不同的表,每个表中都有一个单独的identity列。

如果您需要一起查看所有数据,请使用视图将它们组合起来:

create v_AllTypes as
    select * from type1 union all
    select * from type2 union all
    select * from type3 union all
    select * from type4;

或者,计算输出的序列号:

select t.*,
       row_number() over (partition by CounterNo order by t.id) as TypeSeqNum
from AllTypes t;

如果您的数据模型需要对四个标识列进行有条件的更新,那么它似乎有问题。

于 2013-09-08T15:19:28.903 回答
0

I think you're thinking about this in the wrong way. You have 3 values and these values are determined by another column. Switch it around, create 3 columns and remove the Counter column.

If you have a table with value1, value2 and value3 then the Counter value is implied by the column in which the value resides. Create a unique index on these three columns and add an identity column for a primary key and you're sorted; you can do it all in a stored procedure easily.

于 2013-09-08T12:00:27.950 回答