2

如何在执行另一个 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

4 回答 4

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
于 2012-05-02T06:35:16.140 回答
1

你没有指定你正在使用什么 DMBS,所以我假设 MySQL(它看起来像 MySQL,如果不是,请指定)对于INSERT语句,使用ROW_COUNT()

例如

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()

例如

SELECT SQL_CALC_FOUND_ROWS * FROM MyTable; 
SELECT FOUND_ROWS();

尽管这会告诉您找到的总行数,无论您是否有LIMIT子句。

于 2012-05-02T06:35:24.200 回答
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 变量将包含“没有行受到影响”。这是你要找的,还是我误会了……

于 2012-05-02T06:46:12.633 回答
0

您必须测试 SQLCODE 的值

SQLCA 数据结构中最重要且使用最广泛的字段是 SQLCODE 变量。每次 Microsoft® SQL Server™ 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 引擎都可用的标准)

于 2012-05-02T06:34:54.140 回答