带有 raiserror 语句错误的 MSSQL 案例?
Posted
技术标签:
【中文标题】带有 raiserror 语句错误的 MSSQL 案例?【英文标题】:MSSQL case with raiserror statement error? 【发布时间】:2019-01-09 22:08:15 【问题描述】:我正在尝试检查可用性组是否在正确的主副本上运行。
如果主副本不是特定服务器,我想创建一个将失败的作业。
SELECT CASE
WHEN primary_replica != @@SERVERNAME
THEN (RAISERROR('Wrong replica', 16, 1))
END
FROM sys.dm_hadr_availability_group_states States
如果主副本不是运行作业的服务器,我希望查询会引发错误。但是,我收到以下错误:
Msg 156, Level 15, State 1, Line 3 关键字附近的语法错误 'RAISERROR'。
消息 102,级别 15,状态 1,第 3 行 ')' 附近的语法不正确。
【问题讨论】:
好的。您面临的问题是什么? 【参考方案1】:您不能像这样在case expression
中引发错误。您可以将EXISTS
与IF
一起使用。请注意,这将在没有 AG 的服务器上运行......所以如果不是故意的,您需要考虑这一点。
if exists (SELECT 1 from sys.dm_hadr_availability_group_states where primary_replica != @@SERVERNAME)
BEGIN
RAISERROR('Wrong replica', 16, 1)
END
对于较新的版本,您可以使用sys.fn_hadr_is_primary_replica
If sys.fn_hadr_is_primary_replica ( db_name() ) <> 1
BEGIN
RAISERROR('Wrong replica', 16, 1)
END
【讨论】:
case EXPRESSION,不是语句。您知道这一点,但使用正确的术语总是有帮助的。 这方面我是最差的。谢谢@SMor【参考方案2】:您可以在 SQL 作业步骤中尝试这样来检查主副本是否不是特定服务器:
DECLARE @ServerName NVARCHAR(256) = @@SERVERNAME
DECLARE @RoleDesc NVARCHAR(60)
SELECT @RoleDesc = a.role_desc
FROM sys.dm_hadr_availability_replica_states AS a
JOIN sys.availability_replicas AS b
ON b.replica_id = a.replica_id
WHERE b.replica_server_name = @ServerName
IF @RoleDesc = 'PRIMARY'
BEGIN
RAISERROR ('Error: Wrong replica',16,1 );
END
【讨论】:
以上是关于带有 raiserror 语句错误的 MSSQL 案例?的主要内容,如果未能解决你的问题,请参考以下文章