存储过程from @tablename报错

ianafollow 2014-10-11 11:05:45
报“必须声明表变量”错误,这个@tablename是在存储过程中赋了值,然后再从这个@tablename查询出数据,怎么改啊
set @tablename=(select tname from sys_workflow where wfid=@wfid)
set @count2=(select count(*) from @tablename where guid=@guid and @query_con)
...全文
951 60 打赏 收藏 转发到动态 举报
写回复
用AI写文章
60 条回复
切换为时间正序
请发表友善的回复…
发表回复
ianafollow 2014-11-07
  • 打赏
  • 举报
回复
传错参数了,难怪不出来,好粗心啊
ianafollow 2014-11-07
  • 打赏
  • 举报
回复
结果是null
ianafollow 2014-11-07
  • 打赏
  • 举报
回复
引用 57 楼 roy_88 的回复:
[quote=引用 54 楼 ianafollow 的回复:] [quote=引用 53 楼 roy_88 的回复:] 用法错,如果有多条记录会报错,打印可以合并为一个字符串 set @tname=(select tname from sys_workflow where wfid=convert(int,@wfid))
但是查询出来只有一条啊[/quote] 如果tname有值是可以显示,注意检查数据 如:
declare @tname varchar(100)

SET @tname=(SELECT 'tname')
SELECT @tname
[/quote] 有值的,但是就是打印不出来,咋办
中国风 2014-11-07
  • 打赏
  • 举报
回复
引用 54 楼 ianafollow 的回复:
[quote=引用 53 楼 roy_88 的回复:] 用法错,如果有多条记录会报错,打印可以合并为一个字符串 set @tname=(select tname from sys_workflow where wfid=convert(int,@wfid))
但是查询出来只有一条啊[/quote] 如果tname有值是可以显示,注意检查数据 如:
declare @tname varchar(100)

SET @tname=(SELECT 'tname')
SELECT @tname
ianafollow 2014-11-07
  • 打赏
  • 举报
回复
引用 53 楼 roy_88 的回复:
用法错,如果有多条记录会报错,打印可以合并为一个字符串 set @tname=(select tname from sys_workflow where wfid=convert(int,@wfid))
因为那个wfid是主键,所有只有一条
中国风 2014-11-07
  • 打赏
  • 举报
回复
ALTER proc [dbo].[APP_WriteInProcTwo](@guid varchar(50),@wfid varchar(8))
as
begin
declare @tname varchar(max)--max

declare @prenoteid int
declare @noteid int
declare @nextnoteid int
declare @exptype int--处理人类型
declare @formdata varchar(50)
declare @fzcount int
declare @procuser varchar(50)
declare @protype varchar(200)
declare @finished int
declare @nowproc varchar(100)
declare @query_con varchar(200)
declare @count2 int

	SET @tname=''
	select @tname=@tname+tname+ CHAR(10) from sys_workflow where wfid=convert(int,@wfid)
	select @tname
	PRINT @tname--打印显示
END
ianafollow 2014-11-07
  • 打赏
  • 举报
回复
引用 53 楼 roy_88 的回复:
用法错,如果有多条记录会报错,打印可以合并为一个字符串 set @tname=(select tname from sys_workflow where wfid=convert(int,@wfid))
但是查询出来只有一条啊
中国风 2014-11-07
  • 打赏
  • 举报
回复
用法错,如果有多条记录会报错,打印可以合并为一个字符串 set @tname=(select tname from sys_workflow where wfid=convert(int,@wfid))
ianafollow 2014-11-07
  • 打赏
  • 举报
回复
[quote=引用 51 楼 roy_88 的回复:] ALTER proc [dbo].[APP_WriteInProcTwo](@guid varchar(50),@wfid varchar(8)) as begin declare @tname varchar(100) declare @prenoteid int declare @noteid int declare @nextnoteid int declare @exptype int--处理人类型 declare @formdata varchar(50) declare @fzcount int declare @procuser varchar(50) declare @protype varchar(200) declare @finished int declare @nowproc varchar(100) declare @query_con varchar(200) declare @count2 int set @tname=(select tname from sys_workflow where wfid=convert(int,@wfid)) select @tname end 为什么这个存储过程这么简单,却没有select出值,但是把那条sql语句拿出来查是有值的,为什么却打印不出来啊
中国风 2014-11-07
  • 打赏
  • 举报
回复
引用 50 楼 ianafollow 的回复:
[quote=引用 49 楼 roy_88 的回复:] 注意赋值和字符串之间的拼凑
动态执行sql获得值,我知道,现在是动态执行存储过程,不知道怎么获取值,我的这个存储过程,调用的另外一个存储过程最后是用select 出来值作为输出,我就想要得到select后的值,怎么得[/quote] 是获取结果集与当前存储过程里与表联接? 这需要用一个临时表/表变量获取如
Create table #1(ID int,Name sysname)--同 存储过程1结果集相同栏位和类型
insert into #1 exec  存储过程1 参数1
ianafollow 2014-11-07
  • 打赏
  • 举报
回复
引用 49 楼 roy_88 的回复:
注意赋值和字符串之间的拼凑
动态执行sql获得值,我知道,现在是动态执行存储过程,不知道怎么获取值,我的这个存储过程,调用的另外一个存储过程最后是用select 出来值作为输出,我就想要得到select后的值,怎么得
还在加载中灬 2014-10-30
  • 打赏
  • 举报
回复
我没有说过不可以,好吧,你不嫌麻烦的话, 那你就得先创建一个临时表#,表结构与Exec返回的表结构相同,再从这个表里去取值 另外,你上面的这句,select @torecipient from dual只会得到常量
ianafollow 2014-10-30
  • 打赏
  • 举报
回复
得到存储过程的输出参数,也可以用select出来也可以的
还在加载中灬 2014-10-30
  • 打赏
  • 举报
回复
如果执行完sp_Get_Msgman想要得到users1, users2, users3 就需要设为sp_Get_Msgman的存储过程的OUTPUT参数,然后在执行后接收 如果不清楚怎么做,贴下sp_Get_Msgman
ianafollow 2014-10-30
  • 打赏
  • 举报
回复
就是执行完存储过程后,想得到 users1, users2, users3
ianafollow 2014-10-30
  • 打赏
  • 举报
回复
引用 37 楼 ky_min 的回复:
sp_Get_Msgman这个是什么,有OUTPUT参数吗 没有这个系统存储过程吧,另外,如果是自己写的,不建议用SP_开头~~ 如果有的这个系统存储过程的话,帮我科普下~~
sp_Get_Msgman就自己写的存储过程,这个存储过程中最后把需要的都select出来的select @rtn1 as users1,@rtn2 as users2,@rtn3 as users3,此存储过程太多,不贴了
还在加载中灬 2014-10-30
  • 打赏
  • 举报
回复
sp_Get_Msgman这个是什么,有OUTPUT参数吗 没有这个系统存储过程吧,另外,如果是自己写的,不建议用SP_开头~~ 如果有的这个系统存储过程的话,帮我科普下~~
ianafollow 2014-10-30
  • 打赏
  • 举报
回复
我的存储过程: alter proc test_exec(@guid varchar(100),@noteid int) as begin declare @torecipient varchar(150) declare @sql3 nvarchar(2000) declare @users1 varchar(50) declare @users2 varchar(50) declare @users3 varchar(50) set @sql3 = 'exec sp_Get_Msgman @guid,@noteid ' exec sp_executesql @sql3,N'@guid varchar(100),@noteid int,@users1 varchar(50),@users2 varchar(50) out ',@guid,@noteid,@users1,@users2 output print @users1 if @users1 <>'' begin set @torecipient = @users1 end else if @users2 <>'' begin set @torecipient = @users2 end else if @users3 <>'' begin set @torecipient = @users3 end select @torecipient from dual end 在存储过程中动态执行存储过程
ianafollow 2014-10-30
  • 打赏
  • 举报
回复
引用 33 楼 ky_min 的回复:
[quote=引用 30 楼 ianafollow 的回复:] [quote=引用 29 楼 ky_min 的回复:] 类似这样
DECLARE @COUNT INT
EXEC SYS.sp_executesql N'SELECT @COUNT=1',N'@COUNT INT OUTPUT',@COUNT OUT
SELECT @COUNT
ALTER proc [dbo].[table_variable](@guid varchar(100)) as declare @contract_id varchar(20) declare @sql nvarchar(4000) declare @fieldName varchar(20) declare @tablename varchar(50) set @fieldName='contract_id' set @tablename='ERP_production_task_list' set @sql=N'select '+@fieldName+' from ' + @tablename +' where guid='+@guid exec sp_executesql @sql,N'@contract_id nvarchar(20) output',@contract_id out select @contract_id 我传了参数5c6ef103-be23-4270-b9d6-3d00206385a3进去,执行后说'c6ef103' 附近有语法错误。这是为啥[/quote] set @sql=N'select '+@fieldName+' from ' + @tablename +' where guid='''+@guid+'''' 你这句换一下[/quote] 现在我是动态执行存储过程,但是我得不到执行完存储过程的值
中国风 2014-10-30
  • 打赏
  • 举报
回复
注意赋值和字符串之间的拼凑
加载更多回复(40)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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