web-dev-qa-db-fra.com

Utiliser la base de données à l'intérieur d'une procédure stockée

Je dois créer une procédure stockée qui crée un utilisateur dans plusieurs bases de données. Quelque chose comme ça:

USE [database1]

CREATE USER [userLogin] FOR LOGIN [userLogin]

USE [database2]

CREATE USER [userLogin] FOR LOGIN [userLogin]

Étant donné que l'instruction CREATE USER fait son travail dans la base de données actuelle, je dois utiliser l'instruction USE pour changer de base de données, mais elle ne peut pas être utilisée dans des procédures stockées.

Comment puis-je faire ceci?

25
Lamelas84

SQL dynamique

CREATE PROCEDURE spTestProc
AS

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

EXEC ('USE [database2]; CREATE USER [userLogin] FOR LOGIN [userLogin]')
GO
21
gbn

SQL Server nous donne une procédure stockée système pour le faire. Si j'ai bien compris, la méthode recommandée serait d'utiliser 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
5
XIVSolutions

Je l'ai fait comme ci-dessous:

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
Lokesh
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

maintenant c'est travaillé.

1
jram

Utiliser sp_executesql semble fonctionner. Pour plus d'informations, voir http://msdn.Microsoft.com/en-us/library/ms175170.aspx

Je l'ai testé avec cela et cela a bien fonctionné:

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
Purplegoldfish

Il est à noter que si vous souhaitez utiliser des guillemets simples dans une commande EXEC, vous devez doubler le nombre de guillemets simples.

par exemple.

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

Dans cet exemple, John a 2 guillemets simples avant et après . Vous ne pouvez pas utiliser de guillemets doubles pour ce type de requête.

0
Stevie Gray