废话不说,请看我的代码,应该怎么改呢?
SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GOALTER  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'。

解决方案 »

  1.   

    -----刚才有点问题,改正如下----------------------------
    SELECT @RuleIds = 角色编号 FROM 用户信息表 as @TableName where @FieldName = @UserId
    应为
    SELECT @RuleIds = 角色编号 FROM @TableName where @FieldName = @UserId
    --------------------------------------------------------
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GOALTER 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 @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'
      

  2.   

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

  3.   

    Declare @str Varchar(1000)
    select @str = 'SELECT @RuleIds = 角色编号 FROM''' + @TableName +''' where @FieldName = @UserId'set @newSql = N' SELECT * FROM 角色功能查询 WHERE (角色编号 in ( ' + @str +'))'
      

  4.   

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

  5.   

    改用CharIndexALTER 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
      

  6.   

    我又回来了
    SELECT 角色编号 FROM 用户信息表 where 用户编号 = '2'  得到的值为 1,2可是我这么写却出错:
    SELECT * FROM 角色功能查询  WHERE (角色编号 in (SELECT 角色编号 FROM 用户信息表 where 用户编号 = '2'))
    ------------------------运行结果--------------------------------------
    服务器: 消息 245,级别 16,状态 1,行 2
    将 varchar 值 '1,2' 转换为数据类型为 int 的列时发生语法错误。
    ----------------------------------------------------------------------
    直接输入
    SELECT * FROM 角色功能查询  WHERE (角色编号 in (1,2))
    就没事。这个问题解决了就结贴。
      

  7.   

    SELECT * FROM 角色功能查询  WHERE (角色编号 in (SELECT 角色编号 FROM 用户信息表 where 用户编号 = '2'))----------一樣的道理,改為charindex即可SELECT A.* FROM 角色功能查询 A Inner Join 用户信息表 B On CharIndex(',' + Cast(A.角色编号 As Varchar) + ',', ',' + B.角色编号 + ',') > 0
    where B.用户编号 = '2'
      

  8.   

    谢谢 
    paoluo(一天到晚游泳的鱼)
    看到这么多星星真晃眼睛 ,
    所以不能轻易的放过你。
    请问有什么简单的方法能 在存储过程中 将 一条sql语句的返回值 返回给一个变量呢?
    就像我上面问题中的一样。我先结贴了。有时间你就说两句。
      

  9.   

    如果只是普通語句,這個就可以SELECT @RuleIds = 角色编号 FROM 用户信息表 as @TableName where @FieldName = @UserId如果是動態SQL語句,就必須使用sp_executesql
      

  10.   

    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GOALTER PROCEDURE 用户功能查询过程
    @UserId varchar(50),
    @TableName varchar(50),
    @FieldName varchar(50)
    as
    Declare @dot Varchar(10)
    Declare @sqlText Varchar(1000)
    Declare @RuleIds varchar(500)--我要用这个结果作为第二个查询的条件
    Declare @newSql Varchar(1000)  set @sqlText=N'SELECT @RuleIds = 角色编号 FROM @mTableName where @mFieldName = @mUserId'
    exec sp_executesql @sqlText,N'@mTableName varchar(50),@mFieldName varchar(50),
    @mUserId varchar(50)',
    @mTableName=@TableName,@mFieldName=@FieldName,@mUserId=@UserId 
    -- 你这里“SELECT @RuleIds = 角色编号”应该只能取到一条记录吧-_-
    set @newSql = N' SELECT * FROM 角色功能查询 WHERE (角色编号 in ( '''
    set @newSql = @newSql + @RuleIds+'''))'
    print @newSql
    EXECUTE (@newSql)
      

  11.   

    虽然结贴了,但是还是给你一些建议
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GOALTER PROCEDURE 用户功能查询过程
    @UserId varchar(50),
    @TableName varchar(50),
    @FieldName varchar(50)
    as
    Declare @dot Varchar(10)
    Declare @sqlText Varchar(1000)
    Declare @RuleIds varchar(500)--我要用这个结果作为第二个查询的条件
    Declare @newSql Varchar(1000)  set @newSql = N' SELECT * FROM 角色功能查询 WHERE (角色编号 in 
    ( SELECT 角色编号 FROM @mTableName where @mFieldName = @mUserId))'
    EXEC sp_executesql @newSql,N'@mTableName varchar(50),@mFieldName varchar(50),@mUserId varchar(50)',
    @mTableName=@TableName,@mFieldName=@FieldName,@mUserId=@UserId 
    这样写,如果在你的动态Sql中含有变量,就要用到sp_executesql,
    语法:
    exec sp_executesql sql表达式,N'@var1 datatype,@var2 datatype.....'/*语句中出现的变量列表*/,给所有的变量赋值:@var1=@var1.....
    希望对你有所帮助
      

  12.   

    麻烦问一下,就这个过程在.net中调用咋整?老是出错。