2017-04-26 102 views
0

如何將此邏輯轉換爲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 

回答

3
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那樣更高效。 –

1

嘗試:

IF @@ ERROR <> 0

參見@@ERROR的文檔。另外請注意,@LoginName可能包含一些不好的內容,例如';放桌學生;'。這是一個SQL注入漏洞,通常你會想避免sp_executesql並參數化你的查詢。看洛巴諾夫的答案,這更好。

+1

[必備xkcd參考](https://xkcd.com/327/) –

-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 
+0

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

+0

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

+0

@Milney - 如果您是運行SQL代碼的人,SQL注入並不是真正的問題。 sp_addsrvrolemember通常是內部執行的內容;它很少在組織之外提供。 –

-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 

它也似乎您不太可能需要將人員批量添加到系統管理員角色。我不知道你想達到什麼,但它可能不是正確的方法

相關問題