我需要创建一个在多个数据库中创建用户的存储过程。像这样:
USE [database1]
CREATE USER [userLogin] FOR LOGIN [userLogin]
USE [database2]
CREATE USER [userLogin] FOR LOGIN [userLogin]
由于CREATE USER
语句在当前数据库中完成了他的工作,我需要使用USE
语句在数据库之间进行更改,但它不能在存储过程中使用。
我该怎么做?
答案 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