2012-09-27 33 views
3

我在master數據庫中創建了一個存儲過程,因爲我希望能夠在各種數據庫上運行。在SQL Server存儲過程中使用變量

我爲database創建了一個變量,所以當我執行存儲過程時,它將運行在我想要的那個上。我不斷收到此語法錯誤:

Msg 102, Level 15, State 1, Procedure Stuck_Docs_WF_Rpt, Line 12
Incorrect syntax near '.'.

這裏是我的代碼:

ALTER PROCEDURE [dbo].[Stuck_Docs_WF_Rpt] 
    @Database char(25) 
AS 
BEGIN 
    select 
     count(@Database.hsi.itemdata.itemnum) as 'Doc(s) Stuck', 
     @Database.hsi.lcstate.statename as 'Queue', 
     @Database.hsi.lifecycle.lifecyclename as 'Lifecycle' 
    from 
     @Database.hsi.itemdata 
    join 
     @Database.hsi.itemlc on @Database.hsi.itemdata.itemnum = @Database.hsi.itemlc.itemnum 
    join 
     @Database.hsi.lcstate on @Database.hsi.itemlc.statenum = 
@Database.hsi.lcstate.statenum 
    join 
     @Database.hsi.lifecycle on @Database.hsi.itemlc.lcnum = @Database.hsi.lifecycle.lcnum 
    where 
     @Database.hsi.itemdata.itemnum = @Database.hsi.itemlc.itemnum 
     and @Database.hsi.lcstate.statenum = @Database.hsi.itemlc.statenum 
     and @Database.hsi.lcstate.statename Like '%Route' or @Database.hsi.lcstate.statename like '%Initial' 
     and @Database.hsi.itemlc.status = '0' 
     and DateDiff([Day], @Database.hsi.itemlc.transdate, getDate()) >=1 
    group by @Database.hsi.lifecycle.lifecyclename, @Database.hsi.lcstate.statename 
END 
+3

您不能使用變量作爲對象名稱。你需要使用[動態sql](http://www.sommarskog.se/dynamic_sql.html)來解決這個問題。 –

+0

取決於您可以使用多少個數據庫。如果只有2或3我會考慮使用一個案例。對於許多不同的數據庫,您必須使用動態SQL。 – Fred

+0

具體而言,我猜你的語法錯誤發生在'count(@ Database.hsi.itemdata.itemnum)'作爲'Doc(s)Stuck''這一行的第一段時間,「你會得到相同的語法錯誤@Database ...在腳本的其餘部分之後的每個時段。 – 2012-09-27 15:30:54

回答

1

你已經對動態SQL的標題。我用你的同樣的過程,並使其動態。

另外,如果您使用的數據庫名稱少於25個字符,我用varchar而不是char替換了@Database變量。

alter PROCEDURE [dbo].[Stuck_Docs_WF_Rpt] 
    @Database varchar(25) 
AS 
DECLARE @sql varchar(max) 

    SELECT @sql = 'select 
     count('[email protected]+'.hsi.itemdata.itemnum) as ''Doc(s) Stuck'', 
     '[email protected]+'.hsi.lcstate.statename as ''Queue'', 
     '[email protected]+'.hsi.lifecycle.lifecyclename as ''Lifecycle'' 
    from 
     '[email protected]+'.hsi.itemdata 
    join 
     '[email protected]+'.hsi.itemlc on '[email protected]+'.hsi.itemdata.itemnum = '[email protected]+'.hsi.itemlc.itemnum 
    join 
     '[email protected]+'.hsi.lcstate on '[email protected]+'.hsi.itemlc.statenum = 
'[email protected]+'.hsi.lcstate.statenum 
    join 
     '[email protected]+'.hsi.lifecycle on '[email protected]+'.hsi.itemlc.lcnum = '[email protected]+'.hsi.lifecycle.lcnum 
    where 
     '[email protected]+'.hsi.itemdata.itemnum = '[email protected]+'.hsi.itemlc.itemnum 
     and '[email protected]+'.hsi.lcstate.statenum = '[email protected]+'.hsi.itemlc.statenum 
     and '[email protected]+'.hsi.lcstate.statename Like ''%Route'' or '[email protected]+'.hsi.lcstate.statename like ''%Initial'' 
     and '[email protected]+'.hsi.itemlc.status = ''0'' 
     and DateDiff([Day], '[email protected]+'.hsi.itemlc.transdate, getDate()) >=1 
    group by '[email protected]+'.hsi.lifecycle.lifecyclename, '[email protected]+'.hsi.lcstate.statename' 

    print(@sql) 
    --exec(@sql) 
+0

我錯過了原始文章中@database變量的一段時間。修復。 – Vinnie

+0

謝謝!得到它的工作只需要將最後一行從print(sql)更改爲執行(@sql) – Scott

相關問題