日期:2014-05-19  浏览次数:20609 次

存储过程中变量的问题
CREATE   PROC   test1
@TableName   sysname,
@NodeID   int,
@NodeTopID   int   out
AS
DECLARE   @TopID   int
EXEC( 'SELECT   @TopID=isnull(max(TopID),   0)+1   FROM   '+@TableName+ '   WHERE   ParentID= '+@NodeID+ ' ')
SET   @NodeTopID=@TopID
GO

@TopID=isnull(max(TopID),   0)+1   这里出错,应该怎么写呀?

------解决方案--------------------
------------------------------------------
EXEC( 'SELECT @TopID=isnull(max(TopID), 0)+1 FROM '+@TableName+ ' WHERE ParentID= '+@NodeID+ ' ')
----------------------------------------------

此处有两个问题:
1.如果列ParentID为字符型,此处应该写
EXEC( 'SELECT @TopID=isnull(max(TopID), 0)+1 FROM '+@TableName+ ' WHERE ParentID= ' ' '+@NodeID+ ' ' ' ')
否则结果可能为:WHERE ParentID=000001,这样就会出错.
如果列ParentID为数值型的则不必考虑

2.利用EXEC来执行语句时,语句中不能出现变量,也就是说这样是对的:
EXEC( 'SELECT isnull(max(TopID), 0)+1 FROM '+@TableName+ ' WHERE ParentID= ' ' '+@NodeID+ ' ' ' ')
而增加@TopID=后就会提示错误

如果一定要获取返回 值的话,可以使用SQL中的另一个函数sp_executesql
具体的语法可以参考SQL的联机帮助
------解决方案--------------------
--try

CREATE PROC test1
@TableName sysname,
@NodeID int,
@NodeTopID int out
AS
DECLARE @TopID int

declare @sql nvarchar(4000)
set @sql= 'SELECT @TopID=isnull(max(TopID), 0)+1 FROM '+@TableName+ ' WHERE ParentID= ' ' '+@NodeID+ ' ' ' '
sp_executesql @sql, N '@TopID int output ', @TopID output

SET @NodeTopID=@TopID
GO