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

时间:2017-04-26 15:12:47

标签: sql-server tsql

如何将此逻辑转换为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

4 个答案:

答案 0 :(得分:3)

DECLARE @GrantSql INT

EXEC @GrantSql = sp_addsrvrolemember @LoginName, 'sysadmin'

IF GrantSql = 0
BEGIN
    INSERT INTO...
END

答案 1 :(得分:1)

尝试:

IF @@ ERROR<> 0

请参阅@@ERROR的文档。另请注意,@LoginName可能包含不良内容,例如&#39 ;;放桌学生;'。这是一个SQL注入漏洞,一般来说,您希望避免使用sp_executesql并对查询进行参数化。请参阅Lobanov的回答,这是更好的。

答案 2 :(得分:-1)

类似的东西:

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

答案 3 :(得分:-1)

您可以使用带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

您似乎也不太可能需要批量添加人员到sysadmin角色。我不知道你想要达到的目标,但这可能不是正确的方法

相关问题