--just a example: go create proc pro_test as begin transaction insert table select ...... if @@error<>0 begin print ‘错误信息:'+ltrim(@@error) rollback transaction end else begin commit transaction end
ERROR_MESSAGE ( ) 返回类型 nvarchar(2048) 返回值 在 CATCH 块中调用时,返回导致 CATCH 块运行的错误消息的完整文本。该文本包括为所有可替换参数提供的值,如长度、对象名或时间。如果在 CATCH 块作用域以外调用,则返回 NULL。备注 ERROR_MESSAGE 可以在 CATCH 块作用域内的任意位置调用。ERROR_MESSAGE 无论运行多少次,无论在 CATCH 块作用域内的什么位置运行,它都返回错误消息。这与 @@ERROR 之类的函数形成鲜明对比,后者这样的函数只能在紧接导致错误的语句后面的下一个语句中返回错误号,或者在 CATCH 块的第一个语句中返回错误号。在嵌套 CATCH 块中,ERROR_MESSAGE 返回特定于它被引用 CATCH 块作用域的错误消息。例如,外部 TRY...CATCH 构造的 CATCH 块可能具有嵌套 TRY...CATCH 构造。在嵌套 CATCH 块中,ERROR_MESSAGE 返回调用该嵌套 CATCH 块的错误消息。如果 ERROR_MESSAGE 在外部 CATCH 块中运行,它将返回调用该外部 CATCH 块的错误消息。示例 A. 在 CATCH 块中使用 ERROR_MESSAGE 下面的代码示例显示生成被零除错误的 SELECT 语句。将返回错误消息。 复制代码 USE AdventureWorks; GOBEGIN TRY -- Generate a divide-by-zero error. SELECT 1/0; END TRY BEGIN CATCH SELECT ERROR_MESSAGE() AS ErrorMessage; END CATCH; GO B. 在 CATCH 块中将 ERROR_MESSAGE 与其他错误处理工具一起使用 下面的代码示例显示生成被零除错误的 SELECT 语句。同时返回错误消息和有关错误的信息。 复制代码 USE AdventureWorks; GOBEGIN TRY -- Generate a divide-by-zero error. SELECT 1/0; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_STATE() AS ErrorState ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS ErrorMessage; END CATCH; GO
可以在存储过程中加一个output的参数,让C#得到这个参数的实际值.
2楼 用try catch 可否写明具体代码如何实现 谢谢
go if object_id('test','u')is not null drop table test go create table test( id int identity(1,1), value varchar(10) check(isnumeric(value)=1) ) go if OBJECT_ID('pro_test')is not null drop proc pro_test go create proc pro_test @value1 varchar(10), @value2 varchar(10), @value3 varchar(10), @ErrorMessage varchar(2048) output as begin transaction begin try insert test(value) select @value1 union all select @value2 union all select @value3 end try begin catch SELECT @ErrorMessage=ERROR_MESSAGE() end catch if @ErrorMessage is not null begin select @ErrorMessage as ENDMessage rollback transaction end else begin select '插入成功' as ENDMessage commit transaction end --演示插入失败 go declare @ErrorMessage varchar(2048) exec pro_test '12345','af345','90dg',@ErrorMessage output /* ENDMessage INSERT 语句与 CHECK 约束"CK__test__value__02DD43D9"冲突。 该冲突发生于数据库"master",表"dbo.test", column 'value'。 */--演示插入成功 go declare @ErrorMessage varchar(2048) exec pro_test '12345','56324','8956',@ErrorMessage output /* ENDMessage 插入成功 */select * from test/* id value 1 12345 2 56324 3 8956 */--刚刚回来,写了一个例子,不知道符合你的要求么
--just a example:
go
create proc pro_test
as
begin transaction
insert table
select ......
if @@error<>0
begin
print ‘错误信息:'+ltrim(@@error)
rollback transaction
end
else
begin
commit transaction
end
--如果想得到具体的错误信息,可以试试try catch,具体语法如下
返回导致 TRY…CATCH 构造的 CATCH 块运行的错误的消息文本。 Transact-SQL 语法约定语法
ERROR_MESSAGE ( )
返回类型
nvarchar(2048) 返回值
在 CATCH 块中调用时,返回导致 CATCH 块运行的错误消息的完整文本。该文本包括为所有可替换参数提供的值,如长度、对象名或时间。如果在 CATCH 块作用域以外调用,则返回 NULL。备注
ERROR_MESSAGE 可以在 CATCH 块作用域内的任意位置调用。ERROR_MESSAGE 无论运行多少次,无论在 CATCH 块作用域内的什么位置运行,它都返回错误消息。这与 @@ERROR 之类的函数形成鲜明对比,后者这样的函数只能在紧接导致错误的语句后面的下一个语句中返回错误号,或者在 CATCH 块的第一个语句中返回错误号。在嵌套 CATCH 块中,ERROR_MESSAGE 返回特定于它被引用 CATCH 块作用域的错误消息。例如,外部 TRY...CATCH 构造的 CATCH 块可能具有嵌套 TRY...CATCH 构造。在嵌套 CATCH 块中,ERROR_MESSAGE 返回调用该嵌套 CATCH 块的错误消息。如果 ERROR_MESSAGE 在外部 CATCH 块中运行,它将返回调用该外部 CATCH 块的错误消息。示例
A. 在 CATCH 块中使用 ERROR_MESSAGE
下面的代码示例显示生成被零除错误的 SELECT 语句。将返回错误消息。 复制代码
USE AdventureWorks;
GOBEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO
B. 在 CATCH 块中将 ERROR_MESSAGE 与其他错误处理工具一起使用
下面的代码示例显示生成被零除错误的 SELECT 语句。同时返回错误消息和有关错误的信息。 复制代码
USE AdventureWorks;
GOBEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO
go
if object_id('test','u')is not null
drop table test
go
create table test(
id int identity(1,1),
value varchar(10) check(isnumeric(value)=1)
)
go
if OBJECT_ID('pro_test')is not null
drop proc pro_test
go
create proc pro_test
@value1 varchar(10),
@value2 varchar(10),
@value3 varchar(10),
@ErrorMessage varchar(2048) output
as
begin transaction
begin try
insert test(value)
select @value1 union all
select @value2 union all
select @value3
end try
begin catch
SELECT @ErrorMessage=ERROR_MESSAGE()
end catch
if @ErrorMessage is not null
begin
select @ErrorMessage as ENDMessage
rollback transaction
end
else
begin
select '插入成功' as ENDMessage
commit transaction
end
--演示插入失败
go
declare @ErrorMessage varchar(2048)
exec pro_test '12345','af345','90dg',@ErrorMessage output
/*
ENDMessage
INSERT 语句与 CHECK 约束"CK__test__value__02DD43D9"冲突。
该冲突发生于数据库"master",表"dbo.test", column 'value'。
*/--演示插入成功
go
declare @ErrorMessage varchar(2048)
exec pro_test '12345','56324','8956',@ErrorMessage output
/*
ENDMessage
插入成功
*/select * from test/*
id value
1 12345
2 56324
3 8956
*/--刚刚回来,写了一个例子,不知道符合你的要求么
同时加上try catch