存储过程 变量赋值问题

SS_ 2006-07-01 01:51:21
-- 存储过程的逻辑很简单,就是通过输入的表名,字段名,字段值,查出@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变量赋值?
...全文
161 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
SS_ 2006-07-01
  • 打赏
  • 举报
回复
LouisXIV(夜游神) 你回答的真快啊,哈哈,谢谢!
fcuandy 2006-07-01
  • 打赏
  • 举报
回复
你們真快,我只不過是多打了兩個字而已..
fcuandy 2006-07-01
  • 打赏
  • 举报
回复
改成下面的試試,隨便手寫的,可能有手誤.

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变量在内部并没声明过.
LouisXIV 2006-07-01
  • 打赏
  • 举报
回复
--再改一下,类型定义忘写了

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
LouisXIV 2006-07-01
  • 打赏
  • 举报
回复
--try

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(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
LouisXIV 2006-07-01
  • 打赏
  • 举报
回复
看错了-_-

要用sp_executesql语句
csdnweii 2006-07-01
  • 打赏
  • 举报
回复
set @typeSqlStr = 'select +'''+@typeLayerValue+'''='+ @typeLayer +' from '+ @typeTable +'
LouisXIV 2006-07-01
  • 打赏
  • 举报
回复
set @typeSqlStr = 'select @typeLayerValue='+ @typeLayer +' from '+ @typeTable +' where '+ @typeId +'='+ @typeIdValue

改为

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

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧