it-swarm.com.de

Verwenden Sie die Datenbank in einer gespeicherten Prozedur

Ich muss eine gespeicherte Prozedur erstellen, die einen Benutzer in mehr als einer Datenbank erstellt. Etwas wie das:

USE [database1]

CREATE USER [userLogin] FOR LOGIN [userLogin]

USE [database2]

CREATE USER [userLogin] FOR LOGIN [userLogin]

Da die CREATE USER-Anweisung ihre Aufgabe in der aktuellen Datenbank erfüllt, muss ich die USE-Anweisung verwenden, um zwischen Datenbanken zu wechseln. Sie kann jedoch nicht in gespeicherten Prozeduren verwendet werden.

Wie kann ich das machen?

25
Lamelas84

Dynamisches SQL

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 gibt uns dazu eine gespeicherte Systemprozedur. Meines Wissens ist es die empfohlene Methode, sys.sp_grantdbaccess zu verwenden:

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

Ich habe es wie folgt gemacht:

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

jetzt ist es gearbeitet.

1
jram

Die Verwendung von sp_executesql scheint zu funktionieren. Weitere Informationen finden Sie unter http://msdn.Microsoft.com/en-us/library/ms175170.aspx .

Ich habe es mit diesem getestet und es hat gut funktioniert:

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

Wenn Sie in einem EXEC-Befehl einfache Anführungszeichen verwenden möchten, müssen Sie die Anzahl der Anführungszeichen verdoppeln

z.B.

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

In diesem Beispiel hat John vor und nach ihm zwei einfache Anführungszeichen. Sie können keine doppelten Anführungszeichen für diesen Abfragetyp verwenden.

0
Stevie Gray

Wenn Sie dynamisches SQL mit EXEC sp_executesql ('query1') oder EXEC ('query2') schreiben, wird die gewünschte Datenbank zurückgegeben. Wenn Sie statisches SQL oder Ihre Abfrage außerhalb von dynamischen SQL-Anführungszeichen oder Klammern schreiben, funktioniert dies auf master (wo Sie gespeicherte Prozeduren erstellen (Standard ist master)).

CREATE PROCEDURE master.dbo.mysp1
AS

    EXEC ('USE model; SELECT DB_NAME()') -- or sp_executesql N'USE model; SELECT DB_NAME()' 
    --this returns 'model'

GO


CREATE PROCEDURE master.dbo.mysp2
AS

    EXEC ('USE model;') -- or sp_executesql N'USE model;'
    SELECT DB_NAME() 
    -- this returns 'master'

GO
0
Emrah Saglam