运行 来自当前数据库中另一个数据库的存储过程
Run Stored Procedure From Another Database in Current Database
我有一个 shared
数据库和多个 client
数据库。数据存储在 client
数据库中。我们想在 shared
数据库中创建一组主存储过程,并从 client
数据库中执行它们。鉴于以下内容:
use shared;
go
create procedure GetInvoices as
print db_name() ' <- current database'
select * from invoices
go
use client1;
create table invoices(...columns...)
exec shared.dbo.GetInvoices
此returns以下错误:
shared <- current database
Msg 208, Level 16, State 1, Procedure GetInvoices, Line 3
Invalid object name 'invoices'.
没有使用动态SQL,我如何运行shared
中的存储过程来自client1
以便它在 client1
中执行,因此可以访问 client1
?
中的所有表
您可以在创建 link 服务器后使用四部分名称调用存储过程。
或者可以通过openquery选项调用。
链接服务器:
EXEC [服务器名称] .dbname.scheme.StoredProcedureName
打开查询:SELECT * 来自
OPENQUERY( [ServerName] .dbname.scheme.StoredProcedureName)
在您的 "Master" 数据库上试试这个:
CREATE PROCEDURE [dbo].[GetDataFromClient]
@DB VARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @STMT VARCHAR( 300 );
DECLARE @SP VARCHAR( 500 );
SET @SP = 'dbo.GetData';
SET @STMT = 'EXEC(''' + @SP + ''')';
EXEC('USE '+ @db + ';' + @STMT)
END
现在在 "Client" 数据库上:
CREATE TABLE [dbo].[TestClient](
[ID] [int] NOT NULL,
[Description] [varchar](10) NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY].
创建存储过程以从 table TestClient
检索数据
CREATE PROCEDURE [dbo].[GetData]
AS
BEGIN
SELECT *
FROM TestClient;
END
现在您可以使用以下方法从 TestClient 数据库中检索列:
USE [TestMaster]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[GetDataFromClient]
@DB = N'TESTCLIENT'
SELECT 'Return Value' = @return_value
GO
您可以 运行 在 client1
数据库的上下文中 master
数据库中定义的存储过程,并且 查看所有 client1 数据库表,没有 动态SQL,但它使用未记录 存储过程sp_ms_marksystemobject
。
您的存储过程名称必须以 sp_
开头,例如 sp_GetInvoices
。在master
数据库中创建它,然后调用exec sp_ms_marksystemobject sp_GetInvoices
让它看到当前数据库的表。
USE master
GO
CREATE OR ALTER PROCEDURE sp_GetInvoices
AS
BEGIN
SELECT ClientName from Invoice
END
GO
exec sp_ms_marksystemobject sp_GetInvoices
USE client1
GO
create table Invoice (ClientName varchar(100))
insert Invoice select 'Acme Client'
exec sp_GetInvoices
结果(运行宁 SQL 服务器版本 13.0.5081.1):
ClientName
------------
Acme Client
我有一个 shared
数据库和多个 client
数据库。数据存储在 client
数据库中。我们想在 shared
数据库中创建一组主存储过程,并从 client
数据库中执行它们。鉴于以下内容:
use shared;
go
create procedure GetInvoices as
print db_name() ' <- current database'
select * from invoices
go
use client1;
create table invoices(...columns...)
exec shared.dbo.GetInvoices
此returns以下错误:
shared <- current database
Msg 208, Level 16, State 1, Procedure GetInvoices, Line 3
Invalid object name 'invoices'.
没有使用动态SQL,我如何运行shared
中的存储过程来自client1
以便它在 client1
中执行,因此可以访问 client1
?
您可以在创建 link 服务器后使用四部分名称调用存储过程。 或者可以通过openquery选项调用。
链接服务器:
EXEC [服务器名称] .dbname.scheme.StoredProcedureName
打开查询:SELECT * 来自 OPENQUERY( [ServerName] .dbname.scheme.StoredProcedureName)
在您的 "Master" 数据库上试试这个:
CREATE PROCEDURE [dbo].[GetDataFromClient]
@DB VARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @STMT VARCHAR( 300 );
DECLARE @SP VARCHAR( 500 );
SET @SP = 'dbo.GetData';
SET @STMT = 'EXEC(''' + @SP + ''')';
EXEC('USE '+ @db + ';' + @STMT)
END
现在在 "Client" 数据库上:
CREATE TABLE [dbo].[TestClient](
[ID] [int] NOT NULL,
[Description] [varchar](10) NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY].
创建存储过程以从 table TestClient
检索数据CREATE PROCEDURE [dbo].[GetData]
AS
BEGIN
SELECT *
FROM TestClient;
END
现在您可以使用以下方法从 TestClient 数据库中检索列:
USE [TestMaster]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[GetDataFromClient]
@DB = N'TESTCLIENT'
SELECT 'Return Value' = @return_value
GO
您可以 运行 在 client1
数据库的上下文中 master
数据库中定义的存储过程,并且 查看所有 client1 数据库表,没有 动态SQL,但它使用未记录 存储过程sp_ms_marksystemobject
。
您的存储过程名称必须以 sp_
开头,例如 sp_GetInvoices
。在master
数据库中创建它,然后调用exec sp_ms_marksystemobject sp_GetInvoices
让它看到当前数据库的表。
USE master
GO
CREATE OR ALTER PROCEDURE sp_GetInvoices
AS
BEGIN
SELECT ClientName from Invoice
END
GO
exec sp_ms_marksystemobject sp_GetInvoices
USE client1
GO
create table Invoice (ClientName varchar(100))
insert Invoice select 'Acme Client'
exec sp_GetInvoices
结果(运行宁 SQL 服务器版本 13.0.5081.1):
ClientName
------------
Acme Client