2015-04-06 31 views
0

問題: 我正在嘗試創建一個存儲過程,它使用作爲參數傳入的用戶名創建一個Login。沒有使用我在調用過程時傳入的參數。在存儲過程中正確使用輸入參數

我試過的東西: 我已經試過用exec dbo.proc_add_user 'TestLogin'來調用我的程序。
我認爲用這種方式調用它會使用「TestLogin」代替@arg1

這裏是我試圖創建存儲過程/改變:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[proc_add_user] 
(
    @arg1  varchar(255) = null 
) AS 

BEGIN 
    CREATE LOGIN [@arg1] WITH PASSWORD=N'password' MUST_CHANGE, DEFAULT_DATABASE=[master], CHECK_EXPIRATION=ON, CHECK_POLICY=ON 

    GRANT ALTER ANY LOGIN TO [@arg1] 
    GRANT CONNECT SQL TO [@arg1] 
    GRANT VIEW ANY DEFINITION TO [@arg1] 
    GRANT VIEW SERVER STATE TO [@arg1] 

END 

而不是創建一個名爲「TESTLOGIN」登錄的,它創建了一個名爲「@ ARG1」登錄。我也試着設置@arg1名爲@userName聲明的VARCHAR:

declare @userName varchar(255) = @arg1 
BEGIN 
CREATE LOGIN [@userName] WITH PASSWORD=N'password' ... 
... 

我得到這個方法相同的結果。我會盡快回答任何問題,謝謝。

+0

好,你要使用動態SQL而不實際使其動態 – Lamak

+0

你必須創建動態SQL和運行EXEC或sp_executesql的 –

+0

謝謝你之前增加了一個需要空間。我將研究創建動態SQL過程。我通過查看一個類似於varchar變量的過程來創建這個過程。 –

回答

1

重要的是要知道括號是引用的一種形式。僅當列名包含空格或標點或與保留字衝突時纔有必要。

,且查詢是一個動態的SQL,所以...你可以嘗試:

DECLARE @SQLString VARCHAR(500); 

SET @SQLString = 'CREATE LOGIN ' + @login_user + ' WITH PASSWORD=N''password'' MUST_CHANGE, DEFAULT_DATABASE=[master], CHECK_EXPIRATION=ON, CHECK_POLICY=ON'; 

EXEC sp_executesql @SQLString, N'@login_user varchar(255)', @[email protected]; 

詳見this page

編輯:WITH

相關問題