(null)

解决方案 »

  1.   

    写个sql函数来获取ID就可以了三。
      

  2.   

    写个sql函数来获取ID就可以了三。---记录多了后有点慢,不如建立个单号表,用触发器来加
      

  3.   

    语法
    CREATE TRIGGER trigger_name 
    ON { table | view } 
    [ WITH ENCRYPTION ] 
    {
        { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
            [ WITH APPEND ]
            [ NOT FOR REPLICATION ]
            AS
            [ { IF UPDATE ( column )
                [ { AND | OR } UPDATE ( column ) ]
                    [ ...n ]
            | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
                    { comparison_operator } column_bitmask [ ...n ]
            } ] 
            sql_statement [ ...n ] 
        } 
    } 参数
    trigger_name是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。Table | view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。WITH ENCRYPTION加密 syscomments 表中包含 CREATE TRIGGER 语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为 SQL Server 复制的一部分发布。AFTER指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。不能在视图上定义 AFTER 触发器。INSTEAD OF指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。INSTEAD OF 触发器不能在 WITH CHECK OPTION 的可更新视图上定义。如果向指定了 WITH CHECK OPTION 选项的可更新视图添加 INSTEAD OF 触发器,SQL Server 将产生一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。{ [DELETE] [,] [INSERT] [,] [UPDATE] }是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。对于 INSTEAD OF 触发器,不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。WITH APPEND指定应该添加现有类型的其它触发器。只有当兼容级别是 65 或更低时,才需要使用该可选子句。如果兼容级别是 70 或更高,则不必使用 WITH APPEND 子句添加现有类型的其它触发器(这是兼容级别设置为 70 或更高的 CREATE TRIGGER 的默认行为)。有关更多信息,请参见 sp_dbcmptlevel。WITH APPEND 不能与 INSTEAD OF 触发器一起使用,或者,如果显式声明 AFTER 触发器,也不能使用该子句。只有当出于向后兼容而指定 FOR 时(没有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以后的版本将不支持 WITH APPEND 和 FOR(将被解释为 AFTER)。NOT FOR REPLICATION表示当复制进程更改触发器所涉及的表时,不应执行该触发器。AS是触发器要执行的操作。sql_statement是触发器的条件和操作。触发器条件指定其它准则,以确定 DELETE、INSERT 或 UPDATE 语句是否导致执行触发器操作。当尝试 DELETE、INSERT 或 UPDATE 操作时,Transact-SQL语句中指定的触发器操作将生效。触发器可以包含任意数量和种类的 Transact-SQL 语句。触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。触发器中的 Transact-SQL 语句常常包含控制流语言。CREATE TRIGGER 语句中使用几个特殊的表: deleted 和 inserted 是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索 deleted 表中的所有值,请使用: 
    SELECT *
    FROM deleted如果兼容级别等于 70,那么在 DELETE、INSERT 或 UPDATE 触发器中,SQL Server 将不允许引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能访问 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 触发器中检索新值,请将 inserted 表与原始更新表联接。当兼容级别是 65 或更低时,对 inserted 或 deleted 表中允许空值的text、ntext 或 image 列,将返回空值;如果这些列不可为空,则返回零长度字符串。 
    当兼容级别是 80 或更高时,SQL Server 允许在表或视图上通过 INSTEAD OF 触发器更新 text、ntext 或 image 列。n是表示触发器中可以包含多条 Transact-SQL 语句的占位符。对于 IF UPDATE (column) 语句,可以通过重复 UPDATE (column) 子句包含多列。IF UPDATE (column)测试在指定的列上进行的 INSERT 或 UPDATE 操作,不能用于 DELETE 操作。可以指定多列。因为在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要测试在多个列上进行的 INSERT 或 UPDATE 操作,请在第一个操作后指定单独的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 将返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。说明  IF UPDATE (column) 子句的功能等同于 IF、IF...ELSE 或 WHILE 语句,并且可以使用 BEGIN...END 语句块。有关更多信息,请参见控制流语言。 
    可以在触发器主体中的任意位置使用 UPDATE (column)。column是要测试 INSERT 或 UPDATE 操作的列名。该列可以是 SQL Server 支持的任何数据类型。但是,计算列不能用于该环境中。有关更多信息,请参见数据类型。 IF (COLUMNS_UPDATED()) 测试是否插入或更新了提及的列,仅用于 INSERT 或 UPDATE 触发器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。COLUMNS_UPDATED 函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含 8 列以上,则 COLUMNS_UPDATED 返回多个字节,最左边的为最不重要的字节。在 INSERT 操作中 COLUMNS_UPDATED 将对所有列返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。可以在触发器主体中的任意位置使用 COLUMNS_UPDATED。bitwise_operator是用于比较运算的位运算符。updated_bitmask是整型位掩码,表示实际更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 触发器,若要检查列 C2、C3 和 C4 是否都有更新,指定值 14;若要检查是否只有列 C2 有更新,指定值 2。comparison_operator是比较运算符。使用等号 (=) 检查 updated_bitmask 中指定的所有列是否都实际进行了更新。使用大于号 (>) 检查 updated_bitmask 中指定的任一列或某些列是否已更新。column_bitmask是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。 注释
    触发器常常用于强制业务规则和数据完整性。SQL Server 通过表创建语句(ALTER TABLE 和 CREATE TABLE)提供声明引用完整性 (DRI);但是 DRI 不提供数据库间的引用完整性。若要强制引用完整性(有关表的主键和外键之间关系的规则),请使用主键和外键约束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 关键字)。如果触发器表存在约束,则在 INSTEAD OF 触发器执行之后和 AFTER 触发器执行之前检查这些约束。如果违反了约束,则回滚 INSTEAD OF 触发器操作且不执行(激发)AFTER 触发器。可用 sp_settriggerorder 指定表上第一个和最后一个执行的 AFTER 触发器。在表上只能为每个 INSERT、UPDATE 和 DELETE 操作指定一个第一个执行和一个最后一个执行的 AFTER 触发器。如果同一表上还有其它 AFTER 触发器,则这些触发器将以随机顺序执行。如果 ALTER TRIGGER 语句更改了第一个或最后一个触发器,则将除去已修改触发器上设置的第一个或最后一个特性,而且必须用 sp_settriggerorder 重置排序值。只有当触发 SQL 语句(包括所有与更新或删除的对象关联的引用级联操作和约束检查)成功执行后,AFTER 触发器才会执行。AFTER 触发器检查触发语句的运行效果,以及所有由触发语句引起的 UPDATE 和 DELETE 引用级联操作的效果。
      

  4.   

    select max(a) as b from table
    b=b+1
    insert into table(a) values (b)
      

  5.   

    //自動編號完整代碼:var
       s,m:string;
       i:integer;
    begin
       s:='PH'+ FormatdateTime('yyyymmdd',Now());
       with ADOquery1 do
       begin
           close;
           sql.clear;
           sql.Add('select max(PH) as PHmax from Tbl1');
           open;
       end;
            m:=ADOquery1.FieldByName('PHmax').value;
            //if isnull(m,0)=true then
            if m=null then
                    s:= s + '001'
            else
            begin
                    m:=Trim(ADOquery1.FieldByName('PHmax').value);
                    i:=strToint(Trim(copy(m,11,3)));
                    if i<10 then
                            s:= s + '00' + inttostr(i+1)
                    else if i<100 then
                            s:=s + '0' + inttostr(i+1)
                    else
                            s:=s + inttostr(i+1);
            end;
            Label1.caption:=s;
      

  6.   

    如果多人同时修改同一数据库中的同一表的同一条记录時發 
    数据库已经为此提供了锁的机制。
    引用: zjcxc(邹建):
    默认的事务隔离级别下, 当一个用户在修改时, 这条记录会被下独占锁, 其他用户必须等待独占锁释放(即修改操作完成)才能查询及更新
      

  7.   

    用sql 获取序列,将其写到存储过程中即可你是说从0开始对吧,你得表如果为这样得结构;如:table_A(id int ,text1 varchar),2个字段,id为编号,由自己维护--获取顺序号;
    declare @id int
    set @id = isNull(select max(id) + 1 from table_A,0)  --表为empty talbe时默认0如此可以取得和identity 一样得int 类型编号;但是如果断号不好处理,处理断号一般不会带来好得结果,除非你得表没业务关联,简单办法,方法如:
    select IDENTITY(int,1,1) as iid, --这里使用自增字段代替原来得id
           text1
    into #TMP --写入临时表
    from table_A
    order by id asc --按顺序排列delete from table_A --删除历史insert into table_A(id,text1) --重写到原始表,序号被重排列
    select iid,text1 from #TMPdrop table #TMP --删除临时表以上只是int序号得维护;还有,比如你要得到4位得编号,varchar类型,格式如:0004,也有简单方式,如下:
    假如表为:table_A(id varchar,text1 varchar) --编号id 类型为文本,保存4位编码select isNull(
    substring(replace(space(4),' ','0'),1,
    4 - len(cast(
    (select max(cast(id as int))+1 from table_a) as varchar
    ))
    ) + cast(
    (select max(cast(id as int))+1 from table_a) as varchar
    ),'0000')如此即可得到XXXX 4位的编号;方法为取得max id 后计算长度,用substring 从0000中切割,最后重组;更复杂点得还有前缀字符;比如8位编码,4位前缀;如:20050001 ,前缀为2005,处理起来和上面得差不多,我这里没sqlserver,只能凭经验写;有错难免;但我一直采用这样得方式维护编号;至于存储过程得编写,去看sqlserver得帮助文件,更详细。
      

  8.   

    在sql server下,如何保证有一字段值自动增加1而且不重复?请不要说用"自动增加"字段功能,因为该内容有时候要重新从"0"开始计数 和自动增加字段没有什么矛盾的,自动增加字段本身也可以从零开始计数的吧,包括步进都可以改
    再说了从0开始计数和从1开始计数没有什么区别,只不过是一个偏移量罢了
    当然可以使用单号表,专门保存各种计数,多用户环境下加锁就完了
      

  9.   


    我也在贴里问过这样的问题,讨论的是什么方法更好,我本来的想法是用一个表记录多个要自己编号的表的最大号,对应的表增加记录时从这个表获取并更新最大号。
    帖子地址:http://community.csdn.net/Expert/topic/4192/4192727.xml?temp=.5694086
    欢迎讨论