2015-04-06 3 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 заявленного VARCHAR имени @userName:

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 подробности.

Edit: Добавлен необходимое место, прежде чем С

Смежные вопросы