2011-11-17 180 views
22

数据库里面我需要做这在多个数据库中创建一个用户存储过程。事情是这样的:使用存储过程

USE [database1] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

USE [database2] 

CREATE USER [userLogin] FOR LOGIN [userLogin] 

由于CREATE USER声明做他的工作在当前数据库中,我需要使用USE声明数据库之间改变,但它不能在存储过程中使用。

我怎样才能做到这一点?

+0

+1,有用的问题。 –

回答

20

动态SQL

CREATE PROCEDURE spTestProc 
AS 

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

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

使用sp_executesql似乎工作,更多信息请参见http://msdn.microsoft.com/en-us/library/ms175170.aspx

我测试了使用这一点,它工作得很好:

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 
+1

USE应该只在sp_executesql调用的范围内,而不是外部存储过程 – gbn

+1

正如gbn指出的那样,USE命令范围将在使用sp_executesql执行的SQL本地。 –

5

的SQL Server为我们提供了一个系统存储过程来做到这一点。我的理解是,推荐的方法是使用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 
+2

快速检查表明,这些已被弃用http://msdn.microsoft.com/en-us/library/ms178013.aspx。 – gbn

+0

@gbn - 不错。我没有意识到这一点。不过,我一回到家就会对它进行调查。看起来可能需要CREATE LOGIN和CREATE USER的组合。希望过时的(但仍然有效的)sp_grantdbaccess proc能够满足OP的需求。 – XIVSolutions

1
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 

现在它正在工作。

1

我做到了象下面这样:

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

应当注意的是,如果你想在EXEC命令中使用单引号,则需要单引号

例如额提高一倍

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

在这个例子中,约翰在它之前和之后有两个单引号。 对于此类型的查询,不能使用双引号。