在存储过程中使用数据库

时间:2011-11-17 11:48:32

标签: sql-server tsql stored-procedures

我需要创建一个在多个数据库中创建用户的存储过程。像这样:

USE [database1]

CREATE USER [userLogin] FOR LOGIN [userLogin]

USE [database2]

CREATE USER [userLogin] FOR LOGIN [userLogin]

由于CREATE USER语句在当前数据库中完成了他的工作,我需要使用USE语句在数据库之间进行更改,但它不能在存储过程中使用。

我该怎么做?

7 个答案:

答案 0 :(得分:22)

动态SQL

CREATE PROCEDURE spTestProc
AS

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

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

答案 1 :(得分:6)

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 :(得分: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

现在已经奏效了。

答案 3 :(得分: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'

答案 4 :(得分:0)

应该注意的是,如果要在EXEC命令中使用单引号,则需要将单引号的数量加倍

e.g。

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

在这个例子中,John在它之前和之后有2个单引号。 您不能对此类查询使用双引号。

答案 5 :(得分:0)

如果您使用EXEC sp_executesql ('query1')EXEC ('query2')编写动态SQL,这将返回所需的正确数据库。如果您正在编写静态SQL或查询,而在动态SQL引号或括号之外,它将在master(您在其中创建存储过程(默认为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

答案 6 :(得分:-1)

使用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