问存储过程的“返回值”

sswp7 2013-01-11 03:32:55
有一个存储过程,如下:

ALTER PROCEDURE [dbo].[Usp_TransferTest] (
@MeterNo Char(20),
@MeterType Char(4),
@DATime Datetime,
-- @Qty Decimal(18,6),
@Unit Char(4)
)
as
Begin
Set Nocount On;

Declare @DAYear Char(4);
Declare @DAMonth Char(2);
Declare @DADay Char(2);
Declare @DAHour Char(2);
Declare @Time Char(10);
Declare @AvgQty Decimal(18,6);

Declare @RowCnt1 Int;
Declare @RowCnt2 Int;
Declare @RowCnt3 Int;
Declare @RowCnt4 Int;

Set @DAYear = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),1,4);
Set @DAMonth = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),6,2);
Set @DADay = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),9,2);
Set @DAHour = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,114))),1,2);
Set @Time = Replace((Replace(CONVERT(varchar(13),@DATime, 20),'-','')),' ','');
Set @AvgQty = (select AVG(Qty) from SpecialMonitorData where Replace((Replace

(CONVERT(varchar(13), DATime, 20),'-','')),' ','')=@Time and MeterNo=@MeterNo)

Set @RowCnt4 = (Select Count(*) From SpecialDataSumByHour Where MeterNo =

@MeterNo
And MeterType = @MeterType And DADay = IsNull(@DAYear,'') + IsNull

(@DAMonth,'') + IsNull(@DADay,'')
And DAHour = @DAHour);

If IsNull(@RowCnt4,0) = 0
Begin
Set @RowCnt4 = 0;
End

If @RowCnt4 > 0
Begin
Update SpecialDataSumByHour Set AvgQty = @AvgQty
Where MeterNo = @MeterNo
And MeterType = @MeterType
And DADay = IsNull(@DAYear,'') + IsNull(@DAMonth,'') +

IsNull(@DADay,'')
And DAHour = @DAHour ;

End

Else
Begin
Insert SpecialDataSumByHour

(MeterNo,MeterType,DADay,DAHour,AvgQty,Unit)
Select @MeterNo,@MeterType,IsNull(@DAYear,'') + IsNull

(@DAMonth,'') + IsNull(@DADay,''),@DAHour,@AvgQty,@Unit;

End

End

问题:
这样一个存储过程,当它执行成功了也不会有大于零的返回值。C#中执行存储过程的“Command”对象根本不知道,执行成功了吗??? 它执行成功了,返回的值也是“-1”。

怎样修改存储过程可以有一个返回值,当存储过程执行成功了,那么返回值为“1”??? 主要指“Update”和“Insert”有一个成功就行了,那是判断条件。

...全文
340 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoffor 2013-01-15
  • 打赏
  • 举报
回复
存储过程执行成功默认返回0,为什么你们都用1 作为成功?
starrycheng 2013-01-14
  • 打赏
  • 举报
回复
print后@@rowcount 会变成“0”,对的。。。
tan0904 2013-01-12
  • 打赏
  • 举报
回复
在存储过程中定义一个output类型的变量用这个变量来返回值就行了!
szm341 2013-01-11
  • 打赏
  • 举报
回复
现在的存储过程一般用try catch+事务的形式,如果成功返回1并提交事务,失败则返回0回滚事务,C#中用ExecuteScalar()接收存储过程输出的值就可以了

create proc p_test
as
begin 
  begin try
    begin tran
       insert ...
       update ...
    commit
    select 1
  end try
  begin catch
    rollback
    select 0
  end catch
我腫了 2013-01-11
  • 打赏
  • 举报
回复
執行完print后@@rowcount會變成0:
SELECT 1 
PRINT 1
SELECT @@ROWCOUNT

/*

-----------
1

(1 個資料列受到影響)



-----------
0

(1 個資料列受到影響)

*/
@@rowcount 是記錄行數,可以轉換成bit類型:
Select Cast(@@Rowcount As bit) As Return
唐诗三百首 2013-01-11
  • 打赏
  • 举报
回复
加try.. catch..判断是否执行正常. 正常return 1, 异常trturn 0.
sswp7 2013-01-11
  • 打赏
  • 举报
回复
引用 11 楼 bbbbbben 的回复:
C# 我不太懂,好像可以定義參數 get{} 和 set{} get是獲取,set是定義,set可以從sql的存儲過程中獲取輸出值,具體怎麼編寫我就不懂了,你自己百度一下,或者去C#論壇吧。
谢谢,大师。但是,还有一个问题。 ALTER PROCEDURE [dbo].[Usp_TransferDAListToSpecialMonitorData] ( @MeterNo Char(20), @MeterType Char(4), @DATime Datetime, -- @Qty Decimal(18,6), @Unit Char(4) ) as Begin Set Nocount On; Declare @DAYear Char(4); Declare @DAMonth Char(2); Declare @DADay Char(2); Declare @DAHour Char(2); Declare @Time Char(10); Declare @AvgQty Decimal(18,6); Declare @RowCnt1 Int; Declare @RowCnt2 Int; Declare @RowCnt3 Int; Declare @RowCnt4 Int; Set @DAYear = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),1,4); Set @DAMonth = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),6,2); Set @DADay = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),9,2); Set @DAHour = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,114))),1,2); Set @Time = Replace((Replace(CONVERT(varchar(13),@DATime, 20),'-','')),' ',''); Set @AvgQty = (select AVG(Qty) from SpecialMonitorData where Replace((Replace (CONVERT(varchar(13), DATime, 20),'-','')),' ','')=@Time and MeterNo=@MeterNo) Set @RowCnt4 = (Select Count(*) From SpecialDataSumByHour Where MeterNo = @MeterNo And MeterType = @MeterType And DADay = IsNull(@DAYear,'') + IsNull (@DAMonth,'') + IsNull(@DADay,'') And DAHour = @DAHour); If IsNull(@RowCnt4,0) = 0 Begin Set @RowCnt4 = 0; End If @RowCnt4 > 0 Begin Update SpecialDataSumByHour Set AvgQty = @AvgQty Where MeterNo = @MeterNo And MeterType = @MeterType And DADay = IsNull(@DAYear,'') + IsNull(@DAMonth,'') + IsNull(@DADay,'') And DAHour = @DAHour ; End Else Begin Insert SpecialDataSumByHour (MeterNo,MeterType,DADay,DAHour,AvgQty,Unit) Select @MeterNo,@MeterType,IsNull(@DAYear,'') + IsNull (@DAMonth,'') + IsNull(@DADay,''),@DAHour,@AvgQty,@Unit; End print '执行了' --select @@ROWCOUNT as [Return] return @@ROWCOUNT --return 1 End 问题:“Insert”或“Update”执行成功了后,“@@ROWCOUNT”的值并不会变为“1”啊??? “@@ROWCOUNT”的值是记录插入或更新影响的行的吗??? 直接“Return 1”是可以获取的,但是有更新或是插入的时候“@@ROWCOUNT”也是“0”,Why???
我腫了 2013-01-11
  • 打赏
  • 举报
回复
C# 我不太懂,好像可以定義參數 get{} 和 set{} get是獲取,set是定義,set可以從sql的存儲過程中獲取輸出值,具體怎麼編寫我就不懂了,你自己百度一下,或者去C#論壇吧。
sswp7 2013-01-11
  • 打赏
  • 举报
回复
引用 9 楼 bbbbbben 的回复:
如果你想要在存儲過程中輸出結果集的話: SQL code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556USE testgo ------------------------------------------……
谢谢,大师,但“执行存储过程”的“Command”对象怎样获取返回值呢??? 这是,在SQL中获取返回值啊。 public int ExecuteNonQuery(string strSql, params SqlParameter[] paramter) { SqlCommand cmd = new SqlCommand(strSql, Connection); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddRange(paramter); int count = Convert.ToInt32(cmd.ExecuteNonQuery()); connection.Close(); //connection.Dispose(); return count; }
我腫了 2013-01-11
  • 打赏
  • 举报
回复
如果你想要在存儲過程中輸出結果集的話:
USE test
go


------------------------------------------------------------------ Create -----------------------------

IF object_id('tb_test','u')IS NOT NULL
	DROP TABLE tb_test
Go
CREATE TABLE tb_test(ID INT PRIMARY KEY)
Go



IF object_id('pr_test','p')IS NOT NULL
	DROP PROCEDURE pr_test
Go
CREATE PROCEDURE pr_test(
	@ID INT
)
AS


IF NOT EXISTS(SELECT 1 FROM tb_test WHERE ID=@ID)
	INSERT INTO tb_test(ID)
	VALUES(@ID)

SELECT @@ROWCOUNT AS [Return]


GO

------------------------------------------------------------------ Execute -----------------------------

DECLARE @flag BIT


-- first
EXEC pr_test @ID=1

-- second
EXEC pr_test @ID=1


/*

first_Return
-----------
1

second_Return
-----------
0


*/
我腫了 2013-01-11
  • 打赏
  • 举报
回复
Declare @Flag bit exec Usp_TransferDAListToSpecialMonitorData @Return=@Flag output,@MeterNo = 'A05501',@MeterType='UM',@DATime = '2013/1/1 6:01:01.004' , @Unit='V' select @Flag
sswp7 2013-01-11
  • 打赏
  • 举报
回复
如果执行存储过程时,如果加上OUTPUT 关键字, exec Usp_TransferDAListToSpecialMonitorData @Return=0 output,@MeterNo = 'A05501',@MeterType='UM',@DATime = '2013/1/1 6:01:01.004' , @Unit='V' 直接提示错误: 息 179,级别 15,状态 1,第 1 行 Cannot use the OUTPUT option when passing a constant to a stored procedure.
我腫了 2013-01-11
  • 打赏
  • 举报
回复
要外部定義一個接收輸出的參數. 如: declare @接收參數 bit exec sp @Return=@接收參數 output, ...................
sswp7 2013-01-11
  • 打赏
  • 举报
回复
调试存储过程发现, If @RowCnt4 > 0 Begin Update SpecialDataSumByHour Set AvgQty = @AvgQty Where MeterNo = @MeterNo And MeterType = @MeterType And DADay = IsNull(@DAYear,'') + IsNull(@DAMonth,'') + IsNull(@DADay,'') And DAHour = @DAHour ; End Else Begin Insert SpecialDataSumByHour (MeterNo,MeterType,DADay,DAHour,AvgQty,Unit) Select @MeterNo,@MeterType,IsNull(@DAYear,'') + IsNull (@DAMonth,'') + IsNull(@DADay,''),@DAHour,@AvgQty,@Unit; End print '执行了' select @Return=@@ROWCOUNT End 执行存储过程: exec Usp_TransferDAListToSpecialMonitorData @Return=0,@MeterNo = 'A05501',@MeterType='UM',@DATime = '2013/1/1 6:01:01.004' , @Unit='V' 只返回了“执行了”三个字,“@Return”这个值并没有返回啊??? 大师,是不是select @Return=@@ROWCOUNT这样返回受影响的行有问题???
sswp7 2013-01-11
  • 打赏
  • 举报
回复
引用 2 楼 bbbbbben 的回复:
SQL code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273USE testgo ----------------------------……
不行啊,大师。。。 ALTER PROCEDURE [dbo].[Usp_TransferTest] ( @Return BIT OUTPUT, @MeterNo Char(20), @MeterType Char(4), @DATime Datetime, -- @Qty Decimal(18,6), @Unit Char(4) ) SET @Return=@@ROWCOUNT End SqlParameter[] parameters = { new SqlParameter("@MeterNo", SqlDbType.Char,20), new SqlParameter("@MeterType", SqlDbType.Char,4), new SqlParameter("@DATime", SqlDbType.DateTime), new SqlParameter("@Unit", SqlDbType.Char,4), new SqlParameter("@Return", SqlDbType.Bit)}; parameters[0].Value = MeterNo; parameters[1].Value = MeterType; parameters[2].Value = DATime; parameters[3].Value = Unit; parameters[4].Value = false; return dbasehelper.ExecuteNonQuery("Usp_TransferTest", parameters); 执行成功了,但是: int count = Convert.ToInt32(cmd.ExecuteNonQuery()); 返回值还是“-1”。
zoffor 2013-01-11
  • 打赏
  • 举报
回复
我一般用return值 看看大家
我腫了 2013-01-11
  • 打赏
  • 举报
回复
USE test
go



------------------------------------------------------------------ Create -----------------------------

IF object_id('tb_test','u')IS NOT NULL
	DROP TABLE tb_test
Go
CREATE TABLE tb_test(ID INT PRIMARY KEY)
Go



IF object_id('pr_test','p')IS NOT NULL
	DROP PROCEDURE pr_test
Go
CREATE PROCEDURE pr_test(
	@Return BIT OUTPUT
	,@ID INT
)
AS


IF NOT EXISTS(SELECT 1 FROM tb_test WHERE ID=@ID)
	INSERT INTO tb_test(ID)
	VALUES(@ID)

SET @Return=@@ROWCOUNT


GO

------------------------------------------------------------------ Execute -----------------------------

DECLARE @flag BIT


-- first
EXEC pr_test @Return=@flag OUTPUT,@ID=1
SELECT ID AS first_ID FROM tb_test
SELECT @flag AS first_flag
SET @flag=NULL

-- second
EXEC pr_test @Return=@flag OUTPUT,@ID=1
SELECT ID AS second_ID FROM tb_test
SELECT @flag AS second_flag


/*

first_ID
-----------
1

first_flag
----------
1


second_ID
-----------
1


second_flag
-----------
0


*/
-Tracy-McGrady- 2013-01-11
  • 打赏
  • 举报
回复
declare @re int if .......成功 set @re=1 else set @re=0 select re=@re 再前台程序中判断是1还是0

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧