2015-05-14 53 views
1

我有一個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 

這將返回以下錯誤:使用動態SQL

shared <- current database 
Msg 208, Level 16, State 1, Procedure GetInvoices, Line 3 
Invalid object name 'invoices'. 

沒有,我如何從client1運行存儲過程中shared,使其在client1,從而執行有權訪問client1中的所有表格?

+0

我懷疑這是不可能的 –

回答

-1

創建鏈接服務器後,可以使用四個部分名稱調用存儲過程。 或者它可以通過openquery選項來調用。

LinkSerevr:

EXEC [服務器] .dbname.scheme.StoredProcedureName

OPENQUERY:SELECT * FROM OPENQUERY ([服務器] .dbname.scheme.StoredProcedureName)

+1

他想執行來自另一個數據庫的存儲過程,但希望它處理當前數據庫中的數據。 –

+0

在模型數據庫中添加存儲的過程 –

+0

添加到模型並沒有幫助。添加到主人更近一步,但仍然沒有幫助。在proc名稱前面用'sp_'在master中創建時,可以從'client1'數據庫運行它,而不必完全限定存儲過程名稱。然後'print db_name()'顯示'client1',但仍然顯示'invoices'沒有找到。所以即使數據庫上下文是正確的,它仍然在主表中查找表格而不是客戶端數據庫。 –

0

試試這個在您的「大師」 數據庫:

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 
相關問題