2011-02-28 105 views
0

我有存儲過程。爲此,我需要傳遞數據庫名稱作爲來自另一個應用程序或另一個SP的參數。我知道動態SQL的方法,就像,SQL Server動態存儲過程

Create procedure mysp(@dbname varchar(20)) 
as 
begin 
declare @sql varchar(max) 
set @sql='select * from '[email protected]+'.dbo.table' 
end 

exec mysp 'mydb' 

但我不希望SQL語句作爲字符串。因爲在我的SP中,我有很多Sql語句即將到來(不像這隻有SELECT語句)。所以我可以使用,

USE DatabaseName 

存儲過程裏面,這樣我可以在SQL語句中直接使用的數據庫名稱未做它作爲字符串。或者有任何其他的方法。 我的要求,只爲db名稱,我不希望整個sql語句是動態的... 請幫我。 在此先感謝。

回答

0

您可以將USE指令添加到您正在創建的動態查詢中。然後你就可以與該數據庫的表和其他對象的工作,而不限定(動態查詢內):

Create procedure mysp(@dbname varchar(20)) 
as 
begin 
declare @sql varchar(max) 
    set @sql='use '[email protected]; 
    set @[email protected] + ';select ... from dbo.table1'; 
    set @[email protected] + ';update dbo.table2...'; 
    set @[email protected] + ';insert into dbo.table3...'; 
    ... 
    exec(@sql); 
end 

exec mysp 'mydb' 

然而,當你可以做到這一點,它不是東西,你應該做,除非你真的不得不。您可能試圖避免在不同的數據庫中創建相同的過程,但是您可能會在這種方法中遇到其他問題,或者在不使用SP中的動態查詢的情況下搶奪其他方面的優勢。

+0

我得到了一個解決方案。 – 2011-02-28 13:30:13

+0

declare @sql varchar(max) set @sql='USE '[email protected] 然後繼續進行DML查詢......它正在工作 – 2011-02-28 13:31:36

+0

@Robin clave:你的意思是說你按照我的建議做了嗎?或者你是否只在動態查詢中包含'USE ...',其餘的語句是SP的適當部分? – 2011-02-28 14:00:16

0

不,USE在存儲過程,函數和觸發器中是不允許的。

存儲過程應該是數據庫本地的。要訪問另一個數據庫,有一種方法(據我所知),這是你使用的一種。