在SQL Server存储过程中使用变量

3

我在master数据库中创建了一个存储过程,因为我希望能够在各种数据库上运行。

我创建了一个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来完成此操作。 - Joe Stefanelli
根据您可以使用的数据库数量而定。如果只有2或3个,我会考虑使用CASE语句。对于许多不同的数据库,您将需要使用动态SQL。 - Fred
具体而言,我猜测你的语法错误出现在这一行中第一个句号,即"count(@Database.hsi.itemdata.itemnum) as 'Doc(s) Stuck'",同时你也会在脚本的其他部分中,在每个跟随@Database...的句号处得到相同的语法错误提示。 - user74754
1个回答

1

你已经在朝着动态SQL的方向前进了。我使用了你相同的存储过程并将其变为动态的。

此外,我用varchar替换了@Database变量中的char,以防您使用的数据库名称少于25个字符。

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

   SELECT @sql = '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'

    print(@sql)
    --exec(@sql)

我在原始帖子中的@database变量后漏掉了一个句号。已经修复。 - Vinnie
谢谢!已经解决了,只需要将最后一行从print(sql)更改为execute(@sql)。 - Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接