1. 程式人生 > >Yii2.0呼叫sql server儲存過程並獲取返回值

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