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

关于表名作为参数的问题
废话不说,请看我的代码,应该怎么改呢?
SET   QUOTED_IDENTIFIER   ON  
GO
SET   ANSI_NULLS   ON  
GO

ALTER     PROCEDURE   用户功能查询过程  
@UserId   varchar(50),
@TableName   varchar(50),
@FieldName   varchar(50)
as
Declare   @dot   Varchar(10)
Declare   @sqlText   Varchar(1000)
Declare   @RuleIds   varchar(500)--我要用这个结果作为第二个查询的条件

SELECT   @RuleIds   =   角色编号   FROM   用户信息表   as   @TableName     where   @FieldName   =   @UserId
Declare   @newSql   Varchar(1000)   ;  
set   @newSql   =   N '   SELECT   *   FROM   角色功能查询     WHERE   (角色编号   in   (   '  
set   @newSql   =   @newSql   +   @RuleIds+ ')) '
print   @newSql
EXECUTE   (@newSql)
--------------------执行结果---------------------------
服务器:   消息   137,级别   15,状态   2,过程   用户功能查询过程,行   12
必须声明变量   '@TableName '。

------解决方案--------------------
表做參數就必須用動態SQL。
'SELECT @RuleIds = 角色编号 FROM ' ' ' + @TableName + ' ' ' where @FieldName = @UserId '

------解决方案--------------------
楼上的,你的也不对。我估计还会提示
服务器: 消息 137,级别 15,状态 2,过程 用户功能查询过程,行 12
必须声明变量 @FieldName 和 @UserId

------解决方案--------------------
改用CharIndex

ALTER PROCEDURE 用户功能查询过程
@UserId varchar(50),
@TableName varchar(50),
@FieldName varchar(50)
as
Declare @newSql Varchar(1000)
set @newSql = 'Select A.* FROM 角色功能查询 A Inner Join ' + @TableName + ' B ON CharIndex( ' ', ' ' + Cast(A.角色编号 As Varchar) + ' ', ' ', ' ', ' ' + B.角色编号 + ' ', ' ') > 0
Where B. ' + @FieldName + ' = ' ' ' + @UserId + ' ' ' '
EXECUTE (@newSql)
GO