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.