如果执行该变量失败,则停止查询 - SQL

如果执行该变量失败,则停止查询 - SQL

问题描述:

如何将此逻辑转换为SQL语句?如果执行该变量失败,则停止查询 - SQL

IF @GrantSQL is successful, then continue to insert, if not stop query 

这是存储过程:

BEGIN 
    DECLARE @GrantSql NVARCHAR(500) 

    SET @GrantSql = 'EXEC sp_addsrvrolemember [' + @LoginName + '], ''sysadmin''' 

    EXEC sp_executesql @GrantSql 

    -- IF @GrantSQL is successful, then continue to insert, if not stop query 
    BEGIN 
     INSERT INTO.... 
    END 
END 

DECLARE @GrantSql INT 

EXEC @GrantSql = sp_addsrvrolemember @LoginName, 'sysadmin' 

IF GrantSql = 0 
BEGIN 
    INSERT INTO... 
END 
+1

在这种情况下,它的工作原理是因为'sp_addsrvrolemember'只返回两个值,但请注意存储过程的返回类型是'INT ',而不是'BIT'。 – GarethD

+0

@GarethD你是对的,我编辑了我的文章 –

+0

除非你有很好的理由,否则不要使用。它占用了一个完整的字节,并有其他各种问题。答案是正确的,我把它标记为这样,但是这个位几乎总是用来炫耀,并且不像int那样更高效。 –

尝试:

IF @@ ERROR <> 0

参见@@ERROR的文档。另外请注意,@LoginName可能包含一些不好的内容,例如';放桌学生;'。这是一个SQL注入漏洞,通常你会想避免sp_executesql并参数化你的查询。看洛巴诺夫的答案,这更好。

+1

[必备xkcd参考](https://xkcd.com/327/) –

喜欢的东西:

BEGIN 
    DECLARE @GrantSql NVARCHAR(500) 

    SET @GrantSql = 'EXEC sp_addsrvrolemember [' + @LoginName + '], ''sysadmin''' 


    BEGIN TRY 
     EXEC sp_executesql @GrantSql 
    END TRY 
    --'IF @GrantSQL is successful than continue to insert if not stop query' 
    BEGIN CATCH 
     PRINT 'Oh man, this happened: '+ @@ERROR 
     GOTO allDone 
    END 

    -- no errors. We're good to continue... 
    BEGIN 
     INSERT INTO.... 
    END 

allDone: 
END 
+0

sp_addsrvrolemember可能无一例外地返回1(ERROR!)。 –

+0

也是:https://en.wikipedia.org/wiki/SQL_injection – Milney

+0

@Milney - 如果您是运行SQL代码的人,SQL注入并不是真正的问题。 sp_addsrvrolemember通常是内部执行的内容;它很少在组织之外提供。 –

您可以使用输出参数与sp_executesql捕获存储过程的返回值(0表示成功,1失败):

DECLARE @GrantSql NVARCHAR(500); 
DECLARE @ReturnValue INT; 
SET @GrantSql = 'EXEC @ReturnValue = sp_addsrvrolemember [' + @LoginName + '], ''sysadmin'';'; 
EXEC sp_executesql @GrantSql, N'@ReturnValue INT OUTPUT', @ReturnValue OUT; 

IF @ReturnValue = 0 
BEGIN 
    .... 
END 

,但当然,你不需要动态SQL,你可以简单地使用:

DECLARE @ReturnValue INT; 

EXEC @ReturnValue = sp_addsrvrolemember @LoginName = @LoginName, @rolename = 'sysadmin'; 
IF @ReturnValue = 0 
BEGIN 
    .... 
END 

它也似乎您不太可能需要将人员批量添加到系统管理员角色。我不知道你想达到什么,但它可能不是正确的方法