定义了变量,执行存储过程确说没有定义变量

亚细亚 2020-04-02 05:22:13

create procedure test_p
@ipAddress1 varchar(20) output,
@ipAddress2 varchar(20) output
as
begin
declare @a1 varchar(1000)
declare @i int
set @i=1
while @i<=2
begin
set @a1='set @ipAddress'+convert(varchar(30),@i)+'='''+left(dbo.GetSplitOfIndex('162.168.0.1,192.168.0.2',',',@i), 20)+''''
print @a1
exec(@a1)
set @i=@i+1
end
end

declare @ip1 varchar(20)
declare @ip2 varchar(20)
exec test_p @ip1 output,@ip2 output

存储过程的功能:循环将字符串162.168.0.1和162.168.0.2分别赋值给两个输出变量@ipAddress1 , @ipAddress2. 但是运行后确提示未声明变量,如图所示:




...全文
300 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
sp_executesql 可以output方式传参
亚细亚 2020-04-03
  • 打赏
  • 举报
回复
引用 6 楼 Seagull16 的回复:
你把下面的 exec(@a1) 改为 SELECT @a1 试一试。


while @i<=2
begin
set @a1='set @ipAddress'+convert(varchar(30),@i)+'='''+left(dbo.GetSplitOfIndex('162.168.0.1,192.168.0.2',',',@i), 20)+''''
print @a1
exec(@a1) 《《《《======== 改为 SELECT @a1
set @i=@i+1
end

select的功能只是显示出字符串: set @ipAddress1='162.168.0.1', 实际问题是并没有执行这条语句;
Seagull16 2020-04-03
  • 打赏
  • 举报
回复
你把下面的 exec(@a1) 改为 SELECT @a1 试一试。 while @i<=2 begin set @a1='set @ipAddress'+convert(varchar(30),@i)+'='''+left(dbo.GetSplitOfIndex('162.168.0.1,192.168.0.2',',',@i), 20)+'''' print @a1 exec(@a1) 《《《《======== 改为 SELECT @a1 set @i=@i+1 end
亚细亚 2020-04-02
  • 打赏
  • 举报
回复
静态比较好处理,想学习一下动态如何处理。在这个代码中,存储过程输出参数已经定义了,为什么在循环代码中提示没有定义?很想知道其中的原因?
RINK_1 2020-04-02
  • 打赏
  • 举报
回复
引用 2 楼 亚细亚 的回复:
[quote=引用 1 楼 RINK_1 的回复:] 你把定义变量的语句也拼接进去,比如像下面的。你前一个提问不是有类似的操作吗

set @a1='DECLARE @IPADDRESS VARCHAR(100) 
set @ipAddress'+convert(varchar(30),@i)+'='''+left(dbo.GetSplitOfIndex('162.168.0.1,192.168.0.2',',',@i), 20)+'''' 
		    
那如何动态赋值给存储过程的输出变量?[/quote] 你反正IP数量是定死的,就是固定2个,输出变量数量也是定死的,那就别循环了,也别用拆分函数了,直接用SUBSTRING来拆分后,分别赋值个两个变量。 如果IP地址数据不固定,那通过拆分函数生成一个结果集,存储过程直接输出结果集。
亚细亚 2020-04-02
  • 打赏
  • 举报
回复
也就是将获得的字符串赋值给存储过程的两个输出参数:
create procedure test_p
@ipAddress1 varchar(20) output,
@ipAddress2 varchar(20) output
as
亚细亚 2020-04-02
  • 打赏
  • 举报
回复
引用 1 楼 RINK_1 的回复:
你把定义变量的语句也拼接进去,比如像下面的。你前一个提问不是有类似的操作吗


set @a1='DECLARE @IPADDRESS VARCHAR(100)
set @ipAddress'+convert(varchar(30),@i)+'='''+left(dbo.GetSplitOfIndex('162.168.0.1,192.168.0.2',',',@i), 20)+''''


那如何动态赋值给存储过程的输出变量?
RINK_1 2020-04-02
  • 打赏
  • 举报
回复
你把定义变量的语句也拼接进去,比如像下面的。你前一个提问不是有类似的操作吗

set @a1='DECLARE @IPADDRESS VARCHAR(100) 
set @ipAddress'+convert(varchar(30),@i)+'='''+left(dbo.GetSplitOfIndex('162.168.0.1,192.168.0.2',',',@i), 20)+'''' 
		    

34,575

社区成员

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

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