我最好的谷歌结果是这样的:
但是,从BOL,"任何用户都可以指定从0到18的严重级别".
在我的特定存储过程中,我希望将错误返回到.Net客户端应用程序,因此看起来11-18之间的任何严重性级别都可以解决问题.有没有人有关于每个级别的含义以及如何使用它们的任何权威信息?
我的存储过程接受两个参数@EffectiveStartDate DATETIME
@EffectiveEndDate DATETIME
我写了验证代码:
IF(@EffectiveStartDate > @EffectiveEndDate)
BEGIN
RAISERROR ('SPName: InsertUpdateLiquidityDateRule: Start Date: %s cannot be greater than End Date %s',11,1,CAST(@EffectiveStartDate AS varchar(30)),CAST(@EffectiveEndDate AS varchar(30)));
RETURN -1
END
Run Code Online (Sandbox Code Playgroud)
我可以在这里知道我做错了什么.
在编译我的SProc时,它引发了消息"CAST()附近的语法不正确"
我们的客户端代码检测到死锁,等待一段时间,然后重试请求最多5次.重试逻辑基于错误号1205检测死锁.
我的目标是在各种存储过程中测试死锁重试逻辑和死锁处理.我可以使用两个不同的连接创建死锁.但是,我想在单个存储过程本身内部模拟死锁.
死锁引发以下错误消息:
消息1205,第13级,状态51,第1行
事务(进程ID 66)在锁资源上与另一个进程发生死锁,并被选为死锁受害者.重新运行该交易.
我看到此错误消息在sys.messages
:
select * from sys.messages where message_id = 1205 and language_id = 1033
message_id language_id severity is_event_logged text
1205 1033 13 0 Transaction (Process ID %d) was deadlocked on %.*ls resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Run Code Online (Sandbox Code Playgroud)
我不能使用RAISERROR
以下方法引发此错误:
raiserror(1205, 13, 51)
Run Code Online (Sandbox Code Playgroud)
消息2732,级别16,状态1,行1
错误号1205无效.号码必须是13000到2147483647,不能是50000.
我们的死锁重试逻辑检查错误号是否为1205.死锁需要具有与正常死锁相同的消息ID,级别和状态.
有没有办法模拟死锁(使用RAISERROR或任何其他方法)并只用一个进程获取相同的消息号?
我们的数据库使用SQL 2005兼容性,但我们的服务器在2005年到2008年之间有所不同.
我在SQL过程中生成raise错误:
RAISERROR('Already exist',-10,-10)
但我无法在C#中使用以下代码捕获它
catch (SqlException ex)
{
bResult = false;
if (ex.Errors[0].Number == -10)
{
CommonTools.vAddToLog("bInsertNewUser", "ManageUsers", ex.Message);
if ((savePoint != null))
savePoint.Rollback();
}
}
Run Code Online (Sandbox Code Playgroud)
如何捕获C#中引发的错误?
有一个小问题,并想知道我是否正确使用这些.
在我的SQL脚本中有
BEGIN TRY
// check some information and if there are certains errors
RAISERROR ('Errors found, please fix these errors and retry', 1, 2) WITH SETERROR
// Complete normal process if no errors encountered above
PRINT 'IMPORT SUCCEEDED'
END TRY
BEGIN CATCH
PRINT 'IMPORT ABORTED. ERRORS ENCOUNTERED'
END CATCH
Run Code Online (Sandbox Code Playgroud)
但是,这会遇到错误,然后继续执行脚本的其余部分.我错过了什么?谢谢!
在以前的版本中,我们在t-sql中引发了错误:
RAISERROR 50000 'My Error Message'
Run Code Online (Sandbox Code Playgroud)
在最新的SQL Server中,此语法已停止使用,并替换为RaiseError()语法.
我想有一个提出错误的通用方法,到目前为止我能得到的最好的方法是:
sp_addmessage @msgnum = 50001,
@severity = 10,
@msgtext = N'My Error Message', @replace = 'REPLACE';
RAISERROR (50001, 10, 1, 'This error message is not displayed')
Run Code Online (Sandbox Code Playgroud)
但我不能为每条消息创建一个带有sp_addmessage的错误消息,因为有1000个消息.
使用自定义消息引发消息的更好方法是什么?
MSDN声明以下语法:
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
Run Code Online (Sandbox Code Playgroud)
在msg_str
预计一个字符串,最多2047个字符,但截断长字符串.它还可以替换参数,这会截断消息,而不是值提供的字符数:
错误消息最多可包含2,047个字符.如果消息包含2,048个或更多字符,则仅显示前2,044个字符,并添加省略号以指示消息已被截断.请注意,由于内部存储行为,替换参数消耗的字符数多于输出显示的字符数.例如,%d的替换参数(指定值为2)实际上会在消息字符串中生成一个字符,但内部还会占用另外三个存储字符.此存储要求会减少消息输出的可用字符数.指定msg_str时,RAISERROR会引发错误消息,错误编号为50000.
在severity
预计25 0之间的数字,但更正其他号码:
任何用户都可以指定从0到18的严重级别.从19到25的严重级别只能由sysadmin固定服务器角色的成员或具有ALTER TRACE权限的用户指定.对于从19到25的严重性级别,需要WITH LOG选项.严重级别小于0将被解释为0.严重级别大于25将被解释为25.
的state
预计值0到255,但校正零度以下的值:
[state]是0到255之间的整数.负值默认为1.不应使用大于255的值.
运行这些查询时出现以下错误:
RAISEERROR('Test', 20, 1);
Run Code Online (Sandbox Code Playgroud)
Msg 102,Level 15,State 1,Line 1
'Test'附近的语法不正确.
DECLARE @err_message nvarchar(255);
SET @err_message = 'Test';
RAISEERROR(@err_message, 20, 1);
Run Code Online (Sandbox Code Playgroud)
Msg 102,Level 15,State 1,Line 3
'RAISEERROR'附近的语法不正确.
我可以很好地执行各种其他查询.例如:
THROW 50001, 'Test', 1;
Run Code Online (Sandbox Code Playgroud)
Msg 50001,Level 16,State 1,Line …
我有3-4个存储过程 - 如果需要我可以修改 - RAISERROR
用于通知我的应用程序在数据库端的一些致命错误.其中一些存储过程是从C#端ExecuteNonQuery
执行的,而其他存储过程是用ExecuteReader
.目前,我将这些命令包装在一个try { ... } catch (SqlException ThisSqlException) { ... }
块中,但问题是这个异常将至少抛出两个我必须单独处理的场景:
1)连接本身的错误,或者出现故障或类型不匹配的参数; 和
2)我RAISERROR
明确使用时出现的错误.
由于这是一个WCF应用程序,我必须根据异常的性质(无论是否由于RAISERROR
命令)返回客户端应用程序的不同反馈.那么,我怎样才能区分这两种情况呢?
从这里开始跟进,我一直在溢出.所以我试图提出一个异常,以便我确切知道哪里出了问题.
我有这样的事情:
@jit
def train_function(X, y, H):
np.seterr(over="raise", under="raise", invalid="raise")
# do some stuff, start a double loop, and then do:
try:
z[i,j] = math.exp(-beta[j,i])
except OverflowError:
print "Calculation failed! z[i,j] = math.exp(-beta[j,i]), j: " + str(j) + ", i: " +str(i) + ", b: " + str(beta[j,i]) + ", omb: " + str(oneminusbeta[j,i])
raise
class MyClass(object):
# init and other methods
def train(self, X, y, H):
train_function(X, y, H)
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
Traceback (most recent call last):
File "C:\work_asaaki\code\gbc_classifier_train_7.py", …
Run Code Online (Sandbox Code Playgroud) 我想表明我int
在RAISERROR变量@MaxAmount
和@MinAmount
Raiserror('Total Amount should be less than %s and Greater than %s',16,1,@MaxAmount,@MinAmount)
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
必须声明标量变量"@MaxAmount".
raiserror ×10
sql-server ×7
sql ×4
t-sql ×3
c# ×2
deadlock ×1
numba ×1
numpy ×1
overflow ×1
python ×1
sqlexception ×1
unit-testing ×1
wcf ×1