sql2000使用变量做表名的查询

德隆 2009-04-01 07:39:31
declare @dianxin decimal(7,2),
@hipath decimal(7,2),
@xishu decimal(7,3)
declare @biao char(10)

set @biao='bill200903'

select @dianxin=je
from huizhong
where yf='2009-03'
and phone='86224888'

select @hipath=sum(charge)
from @biao

set @xishu=@dianxin/@hipath
print @xishu

if object_id('temp_1') is not null drop table temp_1

select phone,@xishu*sum(case when price=0.3 then charge else 0 end) changtu,@xishu*sum(case when price<>0.3 then charge else 0 end) shihua
from @biao



出错提示:

服务器: 消息 137,级别 15,状态 2,行 16
必须声明变量 '@biao'。
服务器: 消息 137,级别 15,状态 1,行 22
必须声明变量 '@biao'。
...全文
267 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
small_well 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 seventh777 的回复:]
5楼的正解,昨天发贴的时候没看到你写的东西。今天试了一下,很好。想请你解释一下,下面两行的意思:
set @sql=N'select @hipath=sum(charge) from '+@biao
exec sp_executesql @sql,N'@hipath decimal(7,2) output',@hipath=@hipath output

N 第一行的这个N是什么意思?
第二行中output是什么意思,N又是什么意思?

本来初学SQL,水平太差。请指点!
[/Quote]
1.N是unicode的意思,双字节.这个是mssql的规定.你可以查一下mssql的帮助文档就知道了.
2.output的意思指的是定义的这个变量是输出的列,相对应的就有input,不过一般默认为input,所以不明确写出来.我改写
一下你就清楚了.
set @sql=N'select @hipath_out=sum(charge) from '+@biao
exec sp_executesql @sql,N'@hipath_out decimal(7,2) output',@hipath_out=@hipath output
其中,@hipath是在外面定义的,@hipath_out是内部定义的.@hipath_out负责把值传递给外面的@hipath
建议好好看看mssql的帮助文档,我认为那个是最好的教材,你看一下就明白了.
small_well 2009-04-02
  • 打赏
  • 举报
回复
我昨天已经回答了,可以使用mssql系统的存储过程sp_executesql,一方面不仅可以自行添加变量.另一方面,在仅查询条件改变的前提下,mssql可以优化一下速度(因为原来曾使用这个执行计划,mssql还保留着)
small_well 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 small_well 的回复:]
不能直接使用变量来代替表(要使用拼字符串)
declare @sql Nvarchar(2000)
declare @hipath decimal(7,2)
set @sql=N'select @hipath=sum(charge) from '+@biao
exec sp_executesql @sql,N'@hipath decimal(7,2) output',@hipath=@hipath output
select @hipath --所要求的值
[/Quote]
create table bill200903(charge int)
insert into bill200903
select 10 union all
select 20 union all
select 30

declare @t_name varchar(10),@i decimal(7,2),@str_sql Nvarchar(2000)
set @t_name='bill200903'
set @str_sql=N'select @iout=sum(charge) from '+@t_name
exec sp_executesql @str_sql,N'@iout int output',@iout=@i output
select [结果]=@i --所要求的结果


drop table bill200903

/*
(3 行受影响)
结果
---------------------------------------
60.00

(1 行受影响)
*/

德隆 2009-04-02
  • 打赏
  • 举报
回复
5楼的正解,昨天发贴的时候没看到你写的东西。今天试了一下,很好。想请你解释一下,下面两行的意思:
set @sql=N'select @hipath=sum(charge) from '+@biao
exec sp_executesql @sql,N'@hipath decimal(7,2) output',@hipath=@hipath output

N 第一行的这个N是什么意思?
第二行中output是什么意思,N又是什么意思?

本来初学SQL,水平太差。请指点!
zhangyanyang 2009-04-01
  • 打赏
  • 举报
回复
把=改成as试下
或者 exec('select'+ @i + '*sum(charge) from'+ @t_name )
德隆 2009-04-01
  • 打赏
  • 举报
回复
以上方法都试过,不能解决问题。我把问题简化一下。

declare @t_name varchar(10),
@i decimal(7,2),
@str_sql varchar(100)

set @t_name='bill200903'

exec('select'+ @i + '=sum(charge) from'+ @t_name )
出错提示:
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '=' 附近有语法错误。

里面涉及到两个变量,一个是表名,一个是求和的值的存放。
small_well 2009-04-01
  • 打赏
  • 举报
回复
不能直接使用变量来代替表(要使用拼字符串)
declare @sql Nvarchar(2000)
declare @hipath decimal(7,2)
set @sql=N'select @hipath=sum(charge) from '+@biao
exec sp_executesql @sql,N'@hipath decimal(7,2) output',@hipath=@hipath output
select @hipath --所要求的值


ks_reny 2009-04-01
  • 打赏
  • 举报
回复

exec('select'+ @hipath+'=sum(charge) from'+ @biao )

动态sql要用exec()执行
yangqidong 2009-04-01
  • 打赏
  • 举报
回复
exec('select * from '+@biao)
htl258_Tony 2009-04-01
  • 打赏
  • 举报
回复
变量作表名要把查询用字符串先拼接,再用EXEC执行.
  • 打赏
  • 举报
回复
declare @s varchar(8000)
set @s='select phone,'+cast(@xishu as varchar(10)+'*sum(case when price=0.3 then charge else 0 end) changtu,'+cast(@xishu as varchar(10)+'*sum(case when price <>0.3 then charge else 0 end) shihua '+'from ' +@biao
exec(@s)

34,594

社区成员

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

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