带有 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 中引发错误。您可以将EXISTSIF 一起使用。请注意,这将在没有 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 案例?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server2012中的Throw语句尝试 RAISERROR和THROW比较

sql server数据库中raiserror函数的用法

RAISERROR

带有架构的 MSSQL 数据库的 Django 迁移错误

语句错误时的MSSQL案例

以后出现错误时,看不到预期的 PRINT 或 RAISERROR 输出