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、可以正常打印显示返回值。