2012-09-27 30 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

相关问题