Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 从当前数据库中的另一个数据库运行存储过程_Sql Server 2008_Stored Procedures - Fatal编程技术网

Sql server 2008 从当前数据库中的另一个数据库运行存储过程

Sql server 2008 从当前数据库中的另一个数据库运行存储过程,sql-server-2008,stored-procedures,Sql Server 2008,Stored Procedures,我有一个共享数据库和多个客户端数据库。数据存储在客户端数据库中。我们希望在共享数据库中创建一组主存储过程,并从客户机数据库执行它们。鉴于以下情况: use shared; go create procedure GetInvoices as print db_name() ' <- current database' select * from invoices go use client1; create table invoices(...columns...) exec s

我有一个
共享
数据库和多个
客户端
数据库。数据存储在
客户端
数据库中。我们希望在
共享
数据库中创建一组主存储过程,并从
客户机
数据库执行它们。鉴于以下情况:

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
使用共享;
去
创建过程GetInvoices as

print db_name()“创建链接服务器后,可以使用由四部分组成的名称调用存储过程。 也可以通过openquery选项调用它

LinkSerevr:

EXEC[ServerName].dbname.scheme.StoredProcedureName

openquery:从中选择* OPENQUERY([ServerName].dbname.scheme.StoredProcedureName)

在“主”数据库上尝试以下操作:

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
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].
现在在“客户端”数据库上:

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
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].
创建存储过程以从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 Server 13.0.5081.1版上运行):


我怀疑这是不可能的。他想从另一个数据库执行存储过程,但想让它处理当前数据库中的数据。在模型数据库中添加存储过程添加到模型中没有帮助。添加到master更近了一步,但仍然没有帮助。当在master中创建时,进程名称前面有
sp
,您可以从
client1
数据库运行它,而无需完全限定存储过程名称。然后,
print db_name()
显示
client1
,但它仍然表示找不到
invoices
。因此,即使数据库上下文是正确的,它仍然在master中查找表,而不是在客户机数据库中查找表。谢谢你,真的!