2017-05-15 29 views
0

我有一個腳本,如果它存在,然後重新創建它的用戶。我有這樣的重複30次。如下圖所示:如何將User和LogIn作爲參數傳遞給存儲過程?

IF EXISTS (SELECT 1 FROM sys.sysusers AS s WHERE s.name = N'johndoe') 
BEGIN 
    PRINT 'Dropping user johndoe...' 
    DROP USER johndoe; 
END 

CREATE USER [johndoe] FOR LOGIN [uat\johndoe]; 

我想知道是否有可能編寫接受用戶名和域名,然後刪除並重新創建用戶的存儲過程?所以我可以這樣稱呼:

EXEC usp_DropAndRecreateUsers @username='johndoe', @domainName='uat' 

但是,在編寫存儲過程之後,我意識到它不會像我想象的那麼容易。這可能是這個原因尚未完成的原因。但是,仍然可以在SQL Server(2008及更高版本)中執行此操作嗎?

我做什麼(不工作):

CREATE PROCEDURE dbo.usp_DropAndRecreateUsers 
    (@username varchar(100), 
    @domainName varchar(100)) 
AS 
    DECLARE @loginName varchar(200) = '['[email protected]+'\'[email protected]+']'; 

    IF EXISTS (SELECT 1 FROM sys.sysusers AS s WHERE s.name = @username) 
    BEGIN 
     DROP USER @username; 
    END 

    CREATE USER @username FOR LOGIN @loginName; 

更新: 的錯誤是,當我在Drop/Create User @username使用一個參數,它被認爲是無效的SQL語句。錯誤消息如下:Incorrect syntax near '@username'.Expecting ID, or QUOTED_ID.

+1

你可能比「不工作」較爲模糊? – HABO

+0

@HABO「表現不符合預期」。我贏了嗎? –

+0

雖然他有一點,但是你沒有描述你遇到的問題/錯誤,這很難幫助你解決問題。 –

回答

1

而不是從可變運行,創建查詢和執行它

CREATE PROCEDURE dbo.USP_DROPANDRECREATEUSERS 
    (@username varchar(100), 
    @domainName varchar(100)) 
AS 
    BEGIN 
    DECLARE @loginName varchar(200) = '['[email protected]+'\'[email protected]+']'; 
    DECLARE @query VARCHAR(MAX); 
    IF EXISTS (SELECT 1 FROM sys.sysusers AS s WHERE s.name = @username) 
    BEGIN 
     SET @query = 'DROP USER ' + @username; 
     EXEC (@query); 
    END 

    SET @query = 'CREATE USER ' + @username + ' FOR LOGIN ' + @loginName; 
    EXEC (@query); 
    END 
相關問題