怎么获得存储过程执行结果(执行日志)

时间:2021-06-21 19:50:05
1)执行了存储过程,想要得到执行的结果,并输出。
2)执行成功了,执行失败了,错误是哪里这些信息都想要,类似于日志吧。
3)VC代码通过ADO连接的数据库,输出的信息怎么获得,是存储过程?还是其他?

6 个解决方案

#1


riseerror??
exec procname ‘参数’--可以无参,自动返回结果

#2


begin try
exec xxoo
end try
begin catch
raiserror('error:exec proc  xxoo error.',15,1)
return
end catch

#3


1)执行了存储过程,想要得到执行的结果,并输出。
可将结果插入到一个表,从表中获取.

也可将单一结果用变量输出.
使用 OUTPUT 参数
OUTPUT 参数允许外部过程、批处理或多条 Transact-SQL 语句访问在过程执行期间设置的某个值。下面的示例创建一个存储过程 (titles_sum),并使用一个可选的输入参数和一个输出参数。

首先,创建过程:

USE pubs
GO
IF EXISTS(SELECT name FROM sysobjects
      WHERE name = 'titles_sum' AND type = 'P')
   DROP PROCEDURE titles_sum
GO
USE pubs
GO
CREATE PROCEDURE titles_sum @@TITLE varchar(40) = '%', @@SUM money OUTPUT
AS
SELECT 'Title Name' = title
FROM titles 
WHERE title LIKE @@TITLE 
SELECT @@SUM = SUM(price)
FROM titles
WHERE title LIKE @@TITLE
GO

接下来,将该 OUTPUT 参数用于控制流语言。 



说明  OUTPUT 变量必须在创建表和使用该变量时都进行定义。


参数名和变量名不一定要匹配,不过数据类型和参数位置必须匹配(除非使用 @@SUM = variable 形式)。 

DECLARE @@TOTALCOST money
EXECUTE titles_sum 'The%', @@TOTALCOST OUTPUT
IF @@TOTALCOST < 200 
BEGIN
   PRINT ' '
   PRINT 'All of these titles can be purchased for less than $200.'
END
ELSE
   SELECT 'The total cost of these titles is $' 
         + RTRIM(CAST(@@TOTALCOST AS varchar(20)))

下面是结果集:

Title Name                                                               
------------------------------------------------------------------------ 
The Busy Executive's Database Guide
The Gourmet Microwave
The Psychology of Computer Cooking

(3 row(s) affected)

Warning, null value eliminated from aggregate.
 
All of these titles can be purchased for less than $200.



2)执行成功了,执行失败了,错误是哪里这些信息都想要,类似于日志吧。
SQL Server 如何获得详细错误处理信息

【IT168 服务器学院】在SQL Server 2005中处理错误,最重要的因素是@@ERROR变量。每个语句执行以后,你必须查询这个变量值,以保证没有使事务回滚的错误发生。这种方法有些麻烦,更重要的是,还容易出错。另外,在SQL Server 2000中能够处理的错误类型仅限于某些类型的错误。终止事务或批处理的错误就无法处理,也没有详细的错误信息。 
  TRYCATCH

  SQL Server 2005提供TRYCATCH结构,它出现在许多现代迭代程序语言之中,如Java和C#中。此结构让你通过CATCH结构中的一系列新函数访问更为详细的错误信息,这些函数包括:

  ERROR_NUMBER:返回错误号码,与@@ERROR的值相同。

  ERROR_SEVERITY:返回调用CATCH块错误的严重程度。

  ERROR_STATE:返回错误状态号码。

  ERROR_LINE:返回错误发生的行号。

  ERROR_PROCEDURE:返回促使错误发生的存储程序和触发器的名称。

  ERROR_MESSAGE:返回错误的完整信息文本。

  在CATCH块内,你可以在任何地方应用这些函数,它们将返回与发生的错误有关的信息。在CATCH块外,这些函数返回零值。

  处理死锁错误

  让我们来看一个例子,了解如何应用SQL Server 2005中的新错误处理功能来处理死锁情形,在SQL Server 2000的数据库级别下,这种问题几乎无法处理。

  计算机中存在资源竞争就会发生死锁。这种情形并非仅发生在数据库管理系统中,还发生在操作系统或其他任何出现资源争夺的系统中。当一个进程锁定特定的资源,而又需要另外的资源来完成任务时,就会发生死锁。如果另一个进程锁定了第一个进程需要的资源,而且还需要第一个进程获得的资源,就会出现僵局。两个进程都不愿释放自己的资源,意味着两个进程都不能完成自己的任务。

  不过,SQL Serve中本身就存在一个运算法则,在这种情形下,它会随机选择一个失败者,这个失败者释放自己的资源以便另一个进程能够完成自己的任务。这就意味着那个被终止的进程必须再次尝试。在SQL Server 2000及更早的版本中,解决这种情形的最佳方法是在业务层专门针对死锁编写代码,如果探测到死锁情况,就再次尝试事务。随着时间的推移,如果你注意到死锁情形发生的趋势,你就可以在存储程序中包括逻辑,设定死锁的优先权。这种方法允许你在死锁情形下选择失败者,但你无法再次尝试被终止的进程。

  用SQL Server 2005,你能够在数据层发现错误,这样业务层开发人员就不必担心事务再次尝试问题。如果你能够发现一个死锁错误,你就需要再次尝试语句(可能要在一段时间之后,以便释放所需的资源)。

  为说明这些新功能的运作情况,查看列表A。表中的代码用来记录发生的错误。我希望记录错误处理函数的所有信息,以及错误发生的日期和发生错误的数据库。

  我将用列表B中的代码来记录程序中发生的所有错误。注意你不必给程序设定任何参数,此程序将访问上面描述的错误处理函数。这是因为在执行CATCH块的时候,你可以调用这个程序。即使调用了其他程序,你也可以在CATCH块的任何地方参考这些函数。

  列表C专门用来查检死锁错误号,此时为1205。如果FicticiousTable1更新时发生死锁错误,语句即被重试三次。如果重试三次后还不能成功更新,就停止更新此表。

  SQL Server 2005错误处理的优点

  与之前的版本相比,SQL Server 2005提供了一种更为稳健的错误处理工具。在SQL Server 2000数据库层几乎无法处理的死锁问题,现在也能轻松解决。利用这些新功能,你能够将更多精力放在IT商业策略开发上,不用过于关注错误处理。


3)VC代码通过ADO连接的数据库,输出的信息怎么获得,是存储过程?还是其他?
这个不知道.

#4


报错返回是否可用

BEGIN TRY
    -- Generate a divide-by-zero error.
   
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH;


但是我再A存储过程调用了B存储过程,B中Catch语句返回了错误怎么在A中接收?比如用个nvarchar变量接收了output

#5


报错返回是否可用

BEGIN TRY
    -- Generate a divide-by-zero error.
   
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH;


但是我再A存储过程调用了B存储过程,B中Catch语句返回了错误怎么在A中接收?比如用个nvarchar变量接收了output

#6


是结果可以直接select ,要查看错误可以用存储过程反回值来断判


create proc up_t
xx
as
begin
 select xxxxx
 if xxx 什么错 return -1;
 else xxx 什么错 return -2;
 else return 0
end
可以配会try catch一起用。

#1


riseerror??
exec procname ‘参数’--可以无参,自动返回结果

#2


begin try
exec xxoo
end try
begin catch
raiserror('error:exec proc  xxoo error.',15,1)
return
end catch

#3


1)执行了存储过程,想要得到执行的结果,并输出。
可将结果插入到一个表,从表中获取.

也可将单一结果用变量输出.
使用 OUTPUT 参数
OUTPUT 参数允许外部过程、批处理或多条 Transact-SQL 语句访问在过程执行期间设置的某个值。下面的示例创建一个存储过程 (titles_sum),并使用一个可选的输入参数和一个输出参数。

首先,创建过程:

USE pubs
GO
IF EXISTS(SELECT name FROM sysobjects
      WHERE name = 'titles_sum' AND type = 'P')
   DROP PROCEDURE titles_sum
GO
USE pubs
GO
CREATE PROCEDURE titles_sum @@TITLE varchar(40) = '%', @@SUM money OUTPUT
AS
SELECT 'Title Name' = title
FROM titles 
WHERE title LIKE @@TITLE 
SELECT @@SUM = SUM(price)
FROM titles
WHERE title LIKE @@TITLE
GO

接下来,将该 OUTPUT 参数用于控制流语言。 



说明  OUTPUT 变量必须在创建表和使用该变量时都进行定义。


参数名和变量名不一定要匹配,不过数据类型和参数位置必须匹配(除非使用 @@SUM = variable 形式)。 

DECLARE @@TOTALCOST money
EXECUTE titles_sum 'The%', @@TOTALCOST OUTPUT
IF @@TOTALCOST < 200 
BEGIN
   PRINT ' '
   PRINT 'All of these titles can be purchased for less than $200.'
END
ELSE
   SELECT 'The total cost of these titles is $' 
         + RTRIM(CAST(@@TOTALCOST AS varchar(20)))

下面是结果集:

Title Name                                                               
------------------------------------------------------------------------ 
The Busy Executive's Database Guide
The Gourmet Microwave
The Psychology of Computer Cooking

(3 row(s) affected)

Warning, null value eliminated from aggregate.
 
All of these titles can be purchased for less than $200.



2)执行成功了,执行失败了,错误是哪里这些信息都想要,类似于日志吧。
SQL Server 如何获得详细错误处理信息

【IT168 服务器学院】在SQL Server 2005中处理错误,最重要的因素是@@ERROR变量。每个语句执行以后,你必须查询这个变量值,以保证没有使事务回滚的错误发生。这种方法有些麻烦,更重要的是,还容易出错。另外,在SQL Server 2000中能够处理的错误类型仅限于某些类型的错误。终止事务或批处理的错误就无法处理,也没有详细的错误信息。 
  TRYCATCH

  SQL Server 2005提供TRYCATCH结构,它出现在许多现代迭代程序语言之中,如Java和C#中。此结构让你通过CATCH结构中的一系列新函数访问更为详细的错误信息,这些函数包括:

  ERROR_NUMBER:返回错误号码,与@@ERROR的值相同。

  ERROR_SEVERITY:返回调用CATCH块错误的严重程度。

  ERROR_STATE:返回错误状态号码。

  ERROR_LINE:返回错误发生的行号。

  ERROR_PROCEDURE:返回促使错误发生的存储程序和触发器的名称。

  ERROR_MESSAGE:返回错误的完整信息文本。

  在CATCH块内,你可以在任何地方应用这些函数,它们将返回与发生的错误有关的信息。在CATCH块外,这些函数返回零值。

  处理死锁错误

  让我们来看一个例子,了解如何应用SQL Server 2005中的新错误处理功能来处理死锁情形,在SQL Server 2000的数据库级别下,这种问题几乎无法处理。

  计算机中存在资源竞争就会发生死锁。这种情形并非仅发生在数据库管理系统中,还发生在操作系统或其他任何出现资源争夺的系统中。当一个进程锁定特定的资源,而又需要另外的资源来完成任务时,就会发生死锁。如果另一个进程锁定了第一个进程需要的资源,而且还需要第一个进程获得的资源,就会出现僵局。两个进程都不愿释放自己的资源,意味着两个进程都不能完成自己的任务。

  不过,SQL Serve中本身就存在一个运算法则,在这种情形下,它会随机选择一个失败者,这个失败者释放自己的资源以便另一个进程能够完成自己的任务。这就意味着那个被终止的进程必须再次尝试。在SQL Server 2000及更早的版本中,解决这种情形的最佳方法是在业务层专门针对死锁编写代码,如果探测到死锁情况,就再次尝试事务。随着时间的推移,如果你注意到死锁情形发生的趋势,你就可以在存储程序中包括逻辑,设定死锁的优先权。这种方法允许你在死锁情形下选择失败者,但你无法再次尝试被终止的进程。

  用SQL Server 2005,你能够在数据层发现错误,这样业务层开发人员就不必担心事务再次尝试问题。如果你能够发现一个死锁错误,你就需要再次尝试语句(可能要在一段时间之后,以便释放所需的资源)。

  为说明这些新功能的运作情况,查看列表A。表中的代码用来记录发生的错误。我希望记录错误处理函数的所有信息,以及错误发生的日期和发生错误的数据库。

  我将用列表B中的代码来记录程序中发生的所有错误。注意你不必给程序设定任何参数,此程序将访问上面描述的错误处理函数。这是因为在执行CATCH块的时候,你可以调用这个程序。即使调用了其他程序,你也可以在CATCH块的任何地方参考这些函数。

  列表C专门用来查检死锁错误号,此时为1205。如果FicticiousTable1更新时发生死锁错误,语句即被重试三次。如果重试三次后还不能成功更新,就停止更新此表。

  SQL Server 2005错误处理的优点

  与之前的版本相比,SQL Server 2005提供了一种更为稳健的错误处理工具。在SQL Server 2000数据库层几乎无法处理的死锁问题,现在也能轻松解决。利用这些新功能,你能够将更多精力放在IT商业策略开发上,不用过于关注错误处理。


3)VC代码通过ADO连接的数据库,输出的信息怎么获得,是存储过程?还是其他?
这个不知道.

#4


报错返回是否可用

BEGIN TRY
    -- Generate a divide-by-zero error.
   
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH;


但是我再A存储过程调用了B存储过程,B中Catch语句返回了错误怎么在A中接收?比如用个nvarchar变量接收了output

#5


报错返回是否可用

BEGIN TRY
    -- Generate a divide-by-zero error.
   
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH;


但是我再A存储过程调用了B存储过程,B中Catch语句返回了错误怎么在A中接收?比如用个nvarchar变量接收了output

#6


是结果可以直接select ,要查看错误可以用存储过程反回值来断判


create proc up_t
xx
as
begin
 select xxxxx
 if xxx 什么错 return -1;
 else xxx 什么错 return -2;
 else return 0
end
可以配会try catch一起用。