tabla salida procedimientos procedimiento parametros para mostrar guardar ejecutar devolver datos como almacenados almacenado sql-server tsql stored-procedures use

sql-server - salida - parametros procedimientos almacenados sql server



Usa la base de datos dentro de un procedimiento almacenado (6)

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]

Como la declaración CREATE USER hace su trabajo en la base de datos actual, necesito usar la declaración USE para cambiar entre las bases de datos, pero no puede usarse dentro de los procedimientos almacenados.

¿Cómo puedo hacer esto?


Cabe señalar que si desea utilizar comillas simples dentro de un comando EXEC, tendrá que duplicar la cantidad de comillas simples

p.ej

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

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


El uso de sp_executesql parece funcionar, para obtener más información, consulte 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


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


SQL Server nos da un procedimiento almacenado del sistema para hacer esto. Según entiendo, 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


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


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 está trabajado.