你能否在T-SQL的case语句中引发错误?我总是遇到SQL case语句的问题:/
begin try
declare @i int
--set @i = (select COUNT(1) from table_name)
select Item_Num =
CASE (select COUNT(1) from table_name)
when 1 then (select Item_Num from table_name)
when 0 then (raiserror('No records in database', 0, 0))
ELSE (raiserror('Multiple records in database', 0, 0))
END
from table_name
end try
begin catch
declare @errormsg nvarchar(1024),
@severity int,
@errorstate int;
select @errormsg = error_message(),
@severity = error_severity(),
@errorstate = error_state();
raiserror(@errormsg, @severity, @errorstate);
end catch
Run Code Online (Sandbox Code Playgroud) 我想知道人们在存储过程中使用RAISERROR将用户消息(即与业务相关的消息,而不是错误消息)传递给应用程序的想法.
我公司的一些高级开发人员一直在使用这种方法,并在我们的C#代码中捕获SqlException以获取消息并将其显示给用户.我对这种方法不满意,并想知道其他人如何处理来自存储过程的这些类型的用户消息.
我有一个冗长的存储过程,我想在其中执行以下操作:
IF @SubPageDirectory IS NULL
BEGIN
RAISERROR('@SubPageDirectory cannot be NULL', 10, 1)
EXIT STORED PROCEDURE
END
Run Code Online (Sandbox Code Playgroud)
基本上我想检查我的变量是否NULL
,如果是,则向我的.NET Web应用程序返回一条错误消息,并在该阶段停止运行查询.我怎样才能做到这一点?
SQL Server Query Notifications 是一个很棒的工具,但它似乎没有很好地扩展。每个想要/需要通知的应用程序都必须在它需要通知的持续时间内(通常是应用程序运行的整个时间)保持与数据库的开放连接。
我对创造性的解决方案持开放态度。在我的脑海里,我只是想在服务器上放置一项服务,该服务将订阅 SQL Server 查询通知,然后可以通知客户端应用程序。在这种情况下,您只打开了 1 个数据库连接(为什么不一直打开它),然后您的客户端应用程序可以订阅该服务以获取通知。
想法??
我正在尝试编写一些代码,这些代码需要两个单独的列(一个月和一年)。从那里,我希望它查看输入的数字是否已经通过。如果它们已通过,则导致错误通过并停止事务。否则,我希望它继续并将新信息插入表中。我知道我即将使它起作用,但是我似乎无法启动RAISERROR。我确信这与我还很陌生,我遗漏了一些小细节。
目前,我将这两个月用作变量,并制作了第三个变量以将其他两个变量转换为正确的日期时间格式。然后,我使用datediff函数尝试查看它是否已通过这种方式。无济于事。即使卡片日期较旧,我仍会继续执行插入功能。
USE AdventureWorks2012
GO
CREATE TRIGGER BadCreditCardDate
ON Sales.CreditCard
INSTEAD OF INSERT
AS
Begin
DECLARE @ExpMonth tinyint,
@ExpYear smallint,
@ExpMonthYear datetime
SELECT @ExpMonth=ExpMonth,
@ExpYear=ExpYear,
@ExpMonthYear = @ExpYear + '-' + @ExpMonth + '-00'
FROM INSERTED
IF
DATEDIFF(MONTH,@ExpMonthYear,GETDATE()) < 0
BEGIN
RAISERROR ('The Credit Card you have entered has expired.' ,10,1)
ROLLBACK TRANSACTION
END
ELSE
Begin
INSERT INTO CreditCard (CardType, CardNumber, ExpMonth, ExpYear, ModifiedDate)
Select CardType, CardNumber, ExpMonth, ExpYear, ModifiedDate FROM inserted
END
End
Run Code Online (Sandbox Code Playgroud) 我正在查看 Microsoft 70-761 考试的问题,发现了一个麻烦的问题。该问题要求“如果出现警告”。
显然我应该使用RAISERROR
(or THROW
) 语句。我的问题是 - 我应该使用什么严重程度来满足此要求?
我知道 16 是默认值THROW
,但我犹豫是否将其称为警告。也许RAISERROR
将严重性设置为 10 会更合适?
我通过JDBC从jsp与SQL Server 2005进行交互(这是一个分配而不是真正的项目),我在我正在使用的数据库中创建了一个触发器.如果在执行此触发器时未满足某个条件,则通过raiserror()引发错误.我希望这个错误显示在通过JDBC调用SQL Server查询的实际页面上,但是当我打印出SQLException.getMessage()的结果时,我只是得到以下默认消息:
交易在触发器中结束.批次已中止.
有谁知道如何在触发器代码中提取我实际传递给raiserror的文本?我已经尝试过了:
(SQL 2005)raiserror是否可以终止存储的proc.
例如,在一个大型系统中,我们有一个不希望输入特定列的值.在更新触发器中,如果您写:
如果存在(select*from inserted其中testcol = 7)则开始raiseerror('我的自定义错误',16,1)结束
更新信息仍然适用.但是,如果你跑
如果存在(select*from inserted其中testcol = 7)开始选择1/0结束
抛出除以0错误,实际上终止更新.有什么方法可以用raiseerror做到这一点,所以我可以得到自定义错误消息?
我有一个 SAS EG 程序,它检查文件是否存在,如果文件存在则拒绝替换它。
发生这种情况时,我希望 SAS EG 在该程序上显示错误并在日志中显示有意义的自定义错误消息。而且我希望错误消息看起来与人们习惯于在日志中看到的其他错误消息相同,以便他们注意它。
现在,我刚刚导入了一个以我的错误消息为名称的文件。这不是很好,因为它将文件未找到的消息附加到我要显示的消息中。
有什么方法可以声明存在错误并提供错误消息以放入日志
我有一个存储过程PROC
,它接收一些参数.如果其中一个@ID
不是null PROC_A
,则必须执行给定的存储过程.否则,PROC_B
必须执行.问题是它们都可以发出一个RAISERROR
,我希望通过调用堆栈传播,以便在客户端应用程序中显示.但是,这RAISERROR
不会停止PROC
存储过程的其余部分,因为我使用的是IF
子句,因此检查IF ( @@ERROR <> 0 ) RETURN
也不是一种选择.我唯一的选择似乎是使用一个TRY...CATCH
块来包装IF
子句并RAISERROR
从CATCH
块中重新抛出from ,这很麻烦因为那时我将不得不缓存ERROR_MESSAGE()
,ERROR_SEVERITY()
并 再次ERROR_STATE()
使用RAISERROR
.
真的没有更优雅的方式吗?
我是这个论坛的新手,但请耐心等待.我有一个ac #Windows表单,上面有两个复选框.一个叫chkThrowError,另一个叫chkDivideError,都是未选中的.这些控件纯粹用于控制存储过程的执行.我有一个带有以下代码的命令Button:
private void cmdError_Click(object sender, EventArgs e)
{
int ThrowError = 0;
int DividByZero = 0;
if (chkThrowError.Checked)
{
ThrowError = 1;
}
if (chkDivideError.Checked)
{
DividByZero = 1;
}
try
{
clsBBFinances.TestError(ThrowError,DividByZero);
MessageBox.Show("Everything is Hunkey Dorey");
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
clsBBFinances是我的Business Object,TestError例程如下:
public static void TestError(int ThrowError, int ThrowDivideError)
{
System.Data.SqlClient.SqlDataReader objRs = null;
string strsql = "";
bool Success = true;
string ErrMsg = "";
int intCount = 0;
try
{
strsql = …
Run Code Online (Sandbox Code Playgroud) 如何使用c#代码识别从sql存储过程引发的自定义错误消息?
存储过程错误将像这样引发
RAISERROR (N'This is message %s %d.', -- Message text.
10, -- Severity,
1, -- State,
N'number', -- First argument.
5); -- Second argument.
Run Code Online (Sandbox Code Playgroud)
从上面,如何识别错误是自定义错误消息.(即)像这样的东西
try{
--actual code here
}
catch(SqlException ex)
{
--how to check here that the exception is custom one
}
Run Code Online (Sandbox Code Playgroud) 我需要使用RAISERROR来抛出一条消息(弹出消息)并提交该事务.有什么选择吗?
对于严重性18,事务得到了回滚.我已将严重性更改为10并尝试了
RAISERROR('Your Reference Number is %s',10,0,@param);
Run Code Online (Sandbox Code Playgroud)
这但它提交了交易,但没有显示消息.我需要的是必须抛出消息并且必须提交事务
有什么建议吗?