SQL代码中含有变量,请问如何操作,谢谢!

哈特比尔波 网络工程师  2018-07-21 07:58:51
数据表PK数据如下:


我现在是根据用户需求的逻辑来写sql代码操作数据库表,并根据数据表中现有的值更新某一列的值。
在sql编程的代码中有好多的列都是未知的,需要使用变量来实时获取需要的值,另外就是where条件后面的字段对应的值也是不停的在发生变化。所以也定义了一个变量来存放这个值。
现在遇到的问题是:如果将动态的列名和动态的条件值放到一条语句中并将返回的值赋值给另外一个变量。谢谢!
目前的我代码是这样的:

declare @start_number int -- 最开始计算的数字,这个局部变量只用一次,最初开始的期数
declare @end_number int --循环介绍的期数,这个变量只用一次。
declare @benqi_number int -- 本期开奖期数,需要循环使用此变量
declare @xiaqi_number int -- 下期开奖号码,需要循环使用此变量
declare @benqi_rq datetime --当前开奖日期
declare @xiaqi_rq datetime --下期开奖日期
declare @lie_number int --定义列号,S+值
declare @panduan_number int --最开始判断中奖号码的值,TS
declare @xunhuancishu int --定义需要执行循环的次数
declare @xunhuanbianliang int --定义当前循环的次数
declare @ziduan nvarchar(255) --定义查询那个字段的值
set @start_number=(select min(期数) from pk) --初始计算期数数字,这个局部变量只用一次
set @end_number=(select max(期数) from pk) --初始计算期数数字,这个局部变量只用一次
set @benqi_number=@start_number
set @xiaqi_number=@benqi_number+1
set @xunhuancishu=@end_number-@start_number
set @xunhuanbianliang=1
begin
set @benqi_number=@start_number --初始化从哪一期开始计算
--while @xunhuanbianliang < 3--@xunhuancishu
set @benqi_rq=(select 日期 from pk where 期数=@benqi_number)
set @xiaqi_rq=(select 日期 from pk where 期数=@xiaqi_number)
if (@benqi_rq=@xiaqi_rq)
begin
set @lie_number=(select ts from pk where 期数=@benqi_number)%10
-- print (select 'S'+convert(nvarchar(32),@lie_number) from pk where 期数=@benqi_number)
set @ziduan=convert(nvarchar(32),(select @lie_number from pk where 期数=@benqi_number))
set @ziduan=(select concat('S',@ziduan))
print @ziduan
set @panduan_number=(select @ziduan from pk where 期数=@benqi_number)
--set @panduan_number=execute('select '+'@ziduan'+' from pk where 期数='+'@benqi_number')
--select @panduan_number=(select @ziduan from pk where 期数=@benqi_number)
--select @panduan_number= exec('select '+@ziduan+' from pk where 期数='+@benqi_number)
print @panduan_number
--EXEC @panduan_number
--print @benqi_number
--set @panduan_number= (select @ziduan from pk where 期数=@benqi_number)
--set @panduan_number=(select 'S'+convert(nvarchar(32),@lie_number) from pk where 期数=@benqi_number)
--print @panduan_number
--end
end
--set @lie_number=(@pandu_number%10)
else
begin
update pk set JG=(select ts from pk where 期数=@xiaqi_number) where 期数=@xiaqi_number
-- 上面这句的意思是如果在不同日期的期数的时候,重新对判断的号码重新赋值。
print '我爱你'
end
set @xunhuanbianliang=@xunhuanbianliang+1 --循环一次次数累计加1,以便程序根据需求完成任务
end



所有操作都在sql的查询分析器中执行。
目前是在执行到第30行的时候报错:提示:
消息 245,级别 16,状态 1,第 30 行
在将 nvarchar 值 'S2' 转换成数据类型 int 时失败。
...全文
551 点赞 收藏 9
写回复
9 条回复
删库到跑路 2018年08月01日
只能动态拼字符串了
回复 点赞
shinger126 2018年08月01日
set @ziduan=(select concat('S',@ziduan))
print @ziduan
set @panduan_number=(select @ziduan from pk where 期数=@benqi_number)
看这里,这里@ziduan的值已经是S2这样的字符串了,但是 @panduan_number 的类型是int,这里赋值的话,需要将@ziduan的值转换为int,所以会出现转换失败的错误提示
回复 点赞
qq_25073223 2018年07月31日
使用 sp_executesql吧,详解请参考:http://www.maomao365.com/?p=6677
回复 点赞
shinger126 2018年07月25日
看你的代码,逻辑不清晰。你就说清楚想要实现什么目的就行
回复 点赞
xiaoxiangqing 2018年07月25日
用sp_executesql就行了
回复 点赞
二月十六 2018年07月25日
引用 3 楼 hiv002 的回复:
还有哪些朋友可以帮忙的 呢?请帮帮忙吧,谢谢了

这样不行,得用拼接动态执行的方式,类似这样:
DECLARE @sql nvarchar(1000)
DECLARE @ziduan NVARCHAR(100)='a2'
DECLARE @panduan_number DECIMAL
SET @sql ='SELECT TOP 1 @panduan_number='+@ziduan+' FROM pk'

exec sp_executesql @sql, N'@panduan_number DECIMAL out', @panduan_number out

select @panduan_number


最后得到@panduan_number的值
回复 点赞
哈特比尔波 2018年07月24日
还有哪些朋友可以帮忙的 呢?请帮帮忙吧,谢谢了
回复 点赞
哈特比尔波 2018年07月21日
楼上版主好,我的意思是需要将后面的查询结果赋值给@panduan_number ,查询的结果是一个int的值。
现在的问题就是等号后面的(select @ziduan from pk where 期数=@benqi_number)
没有按照预期的值:select S2 from pk where 期数=274573 来执行。
所以想知道后面这个带有变量来表示字段名和变量作为条件值的SQL语句需要怎么连接。
谢谢!
回复 点赞
二月十六 2018年07月21日
set @panduan_number=(select @ziduan from pk where 期数=@benqi_number)


这句有问题,如果后边的select有值,那这句就是set @panduan_number=@ziduan 两个参数类型不一样
回复 点赞
发动态
发帖子
应用实例
创建于2007-09-28

1.1w+

社区成员

6.8w+

社区内容

MS-SQL Server 应用实例
社区公告
暂无公告