Usar la base de datos dentro de un procedimiento almacenado


Necesito hacer un procedimiento almacenado que cree un usuario en más de una base de datos. Algo como esto:

USE [database1]

CREATE USER [userLogin] FOR LOGIN [userLogin]

USE [database2]

CREATE USER [userLogin] FOR LOGIN [userLogin]

Dado que la instrucción CREATE USER hace su trabajo en la base de datos actual, necesito usar la instrucción USE para cambiar entre bases de datos, pero no se puede usar dentro de procedimientos almacenados.

¿Cómo puedo hacer esto?

Author: Sunny Patel, 2011-11-17

6 answers

SQL dinámico

CREATE PROCEDURE spTestProc
AS

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

EXEC ('USE [database2]; CREATE USER [userLogin] FOR LOGIN [userLogin]')
GO
 21
Author: gbn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-17 12:22:26

SQL Server nos da un procedimiento almacenado en el sistema para hacer esto. Tengo entendido que el método recomendado sería usar 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
Author: XIVSolutions,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-17 12:47:51
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

Ahora se trabaja.

 1
Author: jram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-12 03:19:22

Lo hice como a continuación:

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
Author: Lokesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-09 17:45:16

Usar sp_executesql parece funcionar, para más información ver http://msdn.microsoft.com/en-us/library/ms175170.aspx

Lo probé usando esto y funcionó bien:

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
Author: Purplegoldfish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-17 12:18:05

Debe tenerse en cuenta que si desea utilizar comillas simples dentro de un comando EXEC, deberá duplicar la cantidad de comillas simples

Por ejemplo

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

En este ejemplo, Juan tiene 2 comillas simples antes y después de él. No puede usar comillas dobles para este tipo de consulta.

 0
Author: Stevie Gray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-13 11:35:39