Yii2.0调用sql server存储过程并获取返回值

Posted muzi-lee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yii2.0调用sql server存储过程并获取返回值相关的知识,希望对你有一定的参考价值。

1、首先展示创建sql server存储过程的语句,创建一个简单的存储过程,测试用。

 1 SET ANSI_NULLS ON
 2 GO
 3 SET QUOTED_IDENTIFIER ON
 4 GO
 5 
 6 CREATE PROCEDURE [dbo].[register_info]
 7     @name    varchar(50),
 8     @sex    char(1),
 9     @idcard    char(30),
10     @phone    varchar(15),
11     @address    varchar(100),
12     @create_time    datetime
13 AS
14 BEGIN
15 
16     DECLARE @register_id varchar(14);
17 
18     BEGIN TRY
19         BEGIN TRANSACTION;
20             --插入注册信息,这里未做任何验证,直接插入
21             INSERT into register_info (name, sex, idcard, phone, address, create_time) 
22             VALUES (@name, @sex, @idcard, @phone, @address, @create_time); 
23                
24         COMMIT TRANSACTION;
25     END TRY
26     BEGIN CATCH
27         IF (XACT_STATE()) = -1 --处理错误
28         BEGIN
29             --回滚
30             ROLLBACK TRANSACTION;
31             set @register_id = 0
32         END;
33         IF (XACT_STATE()) = 1 --处理死锁
34         BEGIN
35             --提交
36             COMMIT TRANSACTION;
37         END;
38     END CATCH
39     
40     select @register_id as register_id 
41 END

2、在Yii2.0框架中调用sql server存储过程,和执行mysql查询语句一样,sql语句的书写格式需要和调用执行sql server存储过程的书写格式一致。

$procedure_sql = "exec register_info ‘$name‘,‘$sex‘, ‘$idcard‘, ‘$phone‘, ‘$address‘, ‘$create_time‘";//调用sql server存储过程的sql语句
$procedure_command = $db->createCommand($procedure_sql);
$result = $procedure_command->queryOne();//获取返回值

使用var_dump打印 $result,发现报错:

SQLSTATE[IMSSP]: The active result for the query contains no fields.

技术分享图片

3、在SQL Server数据库调用存储过程,发现是可以正常调用,并有返回值的。

而在yii2.0中调用,却报错,查阅资料,发现是因为储存过程执行后,还会返回影响行数而导致的问题。

4、修改存储过程,在存储过程体开头加入"set nocount on"以消除DML语句对返回结果的影响。

技术分享图片

5、重复第二步操作,在yii2.0框架中重新调用执行 sql server 存储过程,并打印 $result:

技术分享图片

6、可以正常打印显示返回值。

以上是关于Yii2.0调用sql server存储过程并获取返回值的主要内容,如果未能解决你的问题,请参考以下文章

sql server远程调用失败怎么解决

sql server存储过程如何输出结果集

SQL Server通过条件搜索获取相关的存储过程等对象

JPA 2.1在sql server中调用存储过程

从 SQL Server 存储过程中获取结果

SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?