Использовать базу данных внутри хранимой процедуры - PullRequest
27 голосов
/ 17 ноября 2011

Мне нужно создать хранимую процедуру, которая создает пользователя в нескольких базах данных.Примерно так:

USE [database1]

CREATE USER [userLogin] FOR LOGIN [userLogin]

USE [database2]

CREATE USER [userLogin] FOR LOGIN [userLogin]

Поскольку оператор CREATE USER выполняет свою работу в текущей базе данных, мне нужно использовать оператор USE для переключения между базами данных, но его нельзя использовать внутри хранимых процедур..

Как я могу это сделать?

Ответы [ 6 ]

23 голосов
/ 17 ноября 2011

Динамический SQL

CREATE PROCEDURE spTestProc
AS

EXEC ('USE [database1]; CREATE USER [userLogin] FOR LOGIN [userLogin]')

EXEC ('USE [database2]; CREATE USER [userLogin] FOR LOGIN [userLogin]')
GO
6 голосов
/ 17 ноября 2011

SQL Server предоставляет нам системную хранимую процедуру для этого.Насколько я понимаю, рекомендуемый метод будет использовать sys.sp_grantdbaccess:

CREATE PROCEDURE usp_CreateTwoUSers

AS
BEGIN

    -- Create a user for a login in the current DB:
    Exec sp_grantdbaccess [userLogin], [name_in_db];

    -- Create a user for a login in an external DB:
    Exec ExternalDatabaseName.sys.sp_grantdbaccess [userLogin], [name_in_db];

END
1 голос
/ 18 октября 2013

Я сделал это, как показано ниже:

Alter Procedure testProc
@dbName varchar(50)
As
declare @var varchar(100)
set @var = 'Exec(''create table tableName(name varchar(50))'')'    
Exec('Use '+ @dbName + ';' + @var)
Exec testProc 'test_db'
1 голос
/ 12 октября 2012
CREATE PROCEDURE spTestProc
AS
BEGIN

EXECUTE sp_executesql N'USE DB1 SELECT * FROM TABLE1'


EXECUTE sp_executesql N'USE DB2 SELECT * FROM Table2'


END

exec spTestProc

теперь это работает.

0 голосов
/ 13 октября 2015

Следует отметить, что если вы хотите использовать одинарные кавычки в команде EXEC, вам потребуется удвоить количество одинарных кавычек

например

EXEC ('USE [database1]; select * from Authors where name = ''John'' ')

В этом примереУ Джона есть две одинарные кавычки до и после него.Вы не можете использовать двойные кавычки для этого типа запроса.

0 голосов
/ 17 ноября 2011

Использование sp_executesql, кажется, работает, для получения дополнительной информации см. http://msdn.microsoft.com/en-us/library/ms175170.aspx

Я проверил это с помощью этого, и он работал нормально:

CREATE PROCEDURE spTestProc
AS
BEGIN

EXECUTE sp_executesql N'USE DB1;'

SELECT * FROM TABLE1
EXECUTE sp_executesql N'USE DB2;'

SELECT * FROM Table2

END

exec spTestProc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...