-- 存储过程的逻辑很简单,就是通过输入的表名,字段名,字段值,查出@typeLayer字段的值
create procedure typeGetLayerStrById
@typeTable varchar(255), -- 类型表名
@typeId varchar(255), -- 类型自增id字段名
@typeIdValue varchar(50), -- 类型自增id字段值
@typeLayer varchar(255), -- 类型层级字段名
@typeLayerValue varchar(100) output -- 类型层级字段值AS
declare @typeSqlStr varchar(1000) -- 类型sql语句字符串
set @typeSqlStr = 'select @typeLayerValue='+ @typeLayer +' from '+ @typeTable +' where '+ @typeId +'='+ @typeIdValue
exec(@typeSqlStr)
print @typeSqlStr
print @typeLayerValue
GO-- 执行语句
exec typeGetLayerStrById 'mytype','type_id','7','type_layer',''-- 结果
服务器: 消息 137,级别 15,状态 1,行 1
必须声明变量 '@typeLayerValue'。
select @typeLayerValue=type_layer from mytype where type_id=7请问 在执行 @typeSqlStr 这个sql语句变量的时候,我怎么给@typeLayerValue变量赋值?

解决方案 »

  1.   

    set @typeSqlStr = 'select @typeLayerValue='+ @typeLayer +' from '+ @typeTable +' where '+ @typeId +'='+ @typeIdValue改为set @typeSqlStr = 'select '+@typeLayerValue+'= '+@typeLayer +' from '+ @typeTable +' where '+ @typeId +'='+ @typeIdValue
      

  2.   

    set @typeSqlStr = 'select +'''+@typeLayerValue+'''='+ @typeLayer +' from '+ @typeTable +'
      

  3.   

    --trycreate procedure typeGetLayerStrById
    @typeTable varchar(255), -- 类型表名
    @typeId varchar(255), -- 类型自增id字段名
    @typeIdValue varchar(50), -- 类型自增id字段值
    @typeLayer varchar(255), -- 类型层级字段名
    @typeLayerValue varchar(100) output -- 类型层级字段值AS
    declare @typeSqlStr nvarchar(4000) -- 类型sql语句字符串
    set @typeSqlStr = 'select @typeLayerValue='+ @typeLayer +' from '+ @typeTable +' where '+ @typeId +'='+ @typeIdValue
    exec sp_executesql @typeSqlStr,N'@typeLayerValue out',@typeLayerValue out
    print @typeSqlStr
    print @typeLayerValue
    GO
      

  4.   

    --再改一下,类型定义忘写了alter procedure typeGetLayerStrById
    @typeTable varchar(255), -- 类型表名
    @typeId varchar(255), -- 类型自增id字段名
    @typeIdValue varchar(50), -- 类型自增id字段值
    @typeLayer varchar(255), -- 类型层级字段名
    @typeLayerValue varchar(100) output -- 类型层级字段值AS
    declare @typeSqlStr nvarchar(4000) -- 类型sql语句字符串
    set @typeSqlStr = 'select @typeLayerValue='+ @typeLayer +' from '+ @typeTable +' where '+ @typeId +'='+ @typeIdValue
    exec sp_executesql @typeSqlStr,N'@typeLayerValue varchar(100) out',@typeLayerValue out
    print @typeSqlStr
    print @typeLayerValue
    GO
      

  5.   

    改成下面的試試,隨便手寫的,可能有手誤.create procedure typeGetLayerStrById
    @typeTable varchar(255), -- 类型表名
    @typeId varchar(255), -- 类型自增id字段名
    @typeIdValue varchar(50), -- 类型自增id字段值
    @typeLayer varchar(255), -- 类型层级字段名
    @typeLayerValue varchar(100) output -- 类型层级字段值AS
    declare @typeSqlStr nvarchar(1000) -- 类型sql语句字符串
    set @typeSqlStr = 'select @typeLayerValue='+ @typeLayer +' from '+ @typeTable +' where '+ @typeId +'='+ @typeIdValue
    EXEC sp_executeSql @typeSqlStr,N'@typeLayerValue Varchar(50) OUTPUT',@typeLayerValue OUTPUT
    print @typeSqlStr
    print @typeLayerValue
    GO你出錯的原因在于
    typelayervalue这个变量是在外部(指EXEC所执执行的语句外部,不指存储过程外部)SQL语句中定义的,因为exec时,内外部代码执行级别不同,编译不在同一空间,所以外部的typelayervalue变量在内部并没声明过.
      

  6.   

    LouisXIV(夜游神)  你回答的真快啊,哈哈,谢谢!