检查sql语句是否已执行

时间:2012-05-02 06:30:32

标签: sql stored-procedures

如何在执行另一个SQL语句之前检查sql语句是否一直在执行。

我这样做

 DECLARE tempId double default 2;
 insert IGNORE  into  `system_users`( `user_id`,`username`,`password`) values (id , userName ,md5(password)) ;

  set tempId= last_insert_id();

  IF tempId <> 0 THEN     
        insert into  `user_profile`(`user_id`, `full_name`, `cellphone`, `Date_time_ added`,`added_by`) values (id, fullName ,cellPhone , CURRENT_TIMESTAMP(),addedBy ) ;

函数last_insert_id()不适用于我的情况,因为user_id不是自动增量pk,它是用户的标识号。什么是用于测试sql语句执行的函数。

4 个答案:

答案 0 :(得分:2)

也许是这样的。查看插入的行是否已存在:

 insert IGNORE  into  `system_users`( `user_id`,`username`,`password`) values (id , userName ,md5(password)) ;

  IF NOT EXISTS(SELECT NULL FROM system_users WHERE system_users=id) 
  BEGIN     
        insert into  `user_profile`(`user_id`, `full_name`, `cellphone`, `Date_time_ added`,`added_by`) values (id, fullName ,cellPhone , CURRENT_TIMESTAMP(),addedBy ) ;
  END

答案 1 :(得分:1)

你没有指定你正在使用的DMBS所以我会假设MySQL(对我来说它看起来像MySQL,请另外说明)对于INSERT语句,请使用ROW_COUNT()

E.g。

DECLARE tempId double default 2;
 insert IGNORE  into  `system_users`( `user_id`,`username`,`password`) values (id , userName ,md5(password)) ;

set tempId= ROW_COUNT();

这将返回受影响的行数。

另请注意,对于SELECT语句,您可以使用FOUND_ROWS()

e.g。

SELECT SQL_CALC_FOUND_ROWS * FROM MyTable; 
SELECT FOUND_ROWS();

虽然这会告诉您找到的总行数,但不管您是否有LIMIT子句。

答案 2 :(得分:1)

您可以在存储过程结束之前添加它,它将指示是否有任何记录受到影响。

    IF @@ROWCOUNT <>1
    BEGIN
    RAISERROR ('An error occured',10,1)
    RETURN -1
    END

例如

    DECLARE tempId double default 2;
     insert IGNORE  into  `system_users`( `user_id`,`username`,`password`) values (id , userName ,md5(password)) ;

    IF NOT EXISTS(SELECT NULL FROM system_users WHERE system_users=id) 
    BEGIN     
    insert into  `user_profile`(`user_id`, `full_name`, `cellphone`, `Date_time_ added`,`added_by`) values (id, fullName ,cellPhone , CURRENT_TIMESTAMP(),addedBy ) ;

    IF @@ROWCOUNT <>1
    BEGIN
    RAISERROR ('No rows were affected',10,1)
    RETURN -1
    END
    END

因此,如果没有修改行,RAISERROR变量将包含“没有行受影响”。这是你在寻找什么,还是我误解了......

答案 3 :(得分:0)

您必须测试SQLCODE的值

  

SQLCA数据结构中最重要和最广泛使用的字段是SQLCODE变量。每次Microsoft®SQLServer™2000运行嵌入式SQL语句时,它都会设置SQLCODE变量的值,以指示上一个嵌入式SQL语句是否成功完成。值为0表示最后一个嵌入式SQL语句成功。 0以外的值表示警告或错误。

来源http://msdn.microsoft.com/en-us/library/aa225200(v=sql.80).aspx

不同的SQLCODE值列表:http://www.caliberdt.com/tips/sqlcode.htm

(我使用了MSSQL Server,但SQLCODE是每个SQL引擎都可用的标准版)