-- 存储过程的逻辑很简单,就是通过输入的表名,字段名,字段值,查出@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变量赋值?
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变量赋值?
@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
@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
@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变量在内部并没声明过.