在SQL语句中表名是否能为可变?

tang688 2008-07-18 04:01:36
SQL语句中内容可以用函数变量来实现可变内容.
比如:
SELECT COUNT(*) FROM BBS主表 WHERE 时间 < str(year(getdate())) + '-' + str(month(getdate()))
+ '-1 0:00:00' AND 时间 >= str(year(getdate())) + '-' + str(month(getdate()) - 1)
+ '-1 0:00:00'
我可以方便地得到上个月的发贴总数,以方便地用于统计.这中间的条件内容是可变的,不管今天是几月几号,得到的都是上个月的统计数据.
我现在想实现表名也是可变.
比如:
select count(*) from [交易+str(year(getdate())) + str(month(getdate()))]
这样是不是有可能实现呢?上面的语句是不可行的,提示表名格式不支持
注以上都是在视图中用.
...全文
258 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
nghf102 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tianhuo_soft 的回复:]
引用 11 楼 tang688 的回复:
这个变量用作字段的好象可以,但用作表名好象不成功.
我对存储过程不熟,对SQL还熟的.
我在网上查找from @
好象也找不到.
是不是表名不能用这个@型的变量的?
这个变量的定义我看都与字段是一样的.
是不是它只能用作字段类型的啊?!


表名可以用@
declared @a table
[/Quote]

你这个是定义一个表,而不是一个表名变量.

表名可以用字符串,然后EXEC(语句)
tianhuo_soft 2008-07-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tang688 的回复:]
这个变量用作字段的好象可以,但用作表名好象不成功.
我对存储过程不熟,对SQL还熟的.
我在网上查找from @
好象也找不到.
是不是表名不能用这个@型的变量的?
这个变量的定义我看都与字段是一样的.
是不是它只能用作字段类型的啊?!
[/Quote]

表名可以用@
declared @a table
tianhuo_soft 2008-07-20
  • 打赏
  • 举报
回复
人呢
qqhmitzk 2008-07-19
  • 打赏
  • 举报
回复
建议写个储存过程,查询传参进去
tianhuo_soft 2008-07-19
  • 打赏
  • 举报
回复

/*
标题:日期分表查询(version 1.0)
作者:张权
网名:悬崖边的舞者
时间:2008-07-14
地点:天津
说明:以日期或月份分表进行多日、多月查询连表查询的有关写法
*/

Create Procedure Search
@date1 datetime, --起始时间
@date2 datetime --终止时间
as
declare @date1New datetime,
@rq varchar(6),
@i int , --记录循环次数
@s varchar(5000) --根据表多少 可以扩大它
set @rq=convert(varchar,@date1,12) --把时间格式化 比如2008-06-20 变成了080620
--set @rq=select convert(varchar,@date1,12)是完全错误的
--select的作用的显示 不是传值

set @s='select * from sensor'+@rq --初始化 @s='select * from sensor080620' 这样第一个表就有了

set @i=datediff(d,@date1,@date2) --日期相减

while @i>0
begin
--如果是非常重要的系统可以在这里加上该物理表是否存在的语句
--if exists(select * from dbo.sysobjects where
--id = object_id(N'c') and OBJECTPROPERTY(id,N'IsUserTable')=1)
--begin
--SELECT '存在 '
--end

set @date1New= dateadd(day,@i,@date1)
set @rq=convert(varchar,@date1New,12)
--如果是按月进行查询 就修改上面
set @s= @s+' union all select * from sensor'+@rq
set @i=@i-1 --累加
end

--忘了加返回值了
select @s
go


exec Search '2008-06-20 00:11:11.000','2008-07-25 00:11:11.000'
drop Procedure Search




pt1314917 2008-07-19
  • 打赏
  • 举报
回复

declare @sql='select count(*) from [交易'+str(year(getdate())) + str(month(getdate()))+']'
exec(@sql)

changjiangzhibin 2008-07-19
  • 打赏
  • 举报
回复
也可在程序中调用动态表名,<C#>使用方法与数值型变量调用同
hery2002 2008-07-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wgzaaa 的回复:]
虽然用动态语句能实现表名的更换,但仅是产生视图就没有必要,最好是写个存储过程,把表名作参数,供调用。
[/Quote]
M1CR0S0FT 2008-07-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tang688 的回复:]
这个变量用作字段的好象可以,但用作表名好象不成功.
我对存储过程不熟,对SQL还熟的.
我在网上查找from @
好象也找不到.
是不是表名不能用这个@型的变量的?
这个变量的定义我看都与字段是一样的.
是不是它只能用作字段类型的啊?!
[/Quote]
总之,你要使表名可变,
那么就将所有的查询语句,拼接为字符串,然后EXEC执行它,也就是执行动态SQL的意思.
那么这时候你的表名就可以声明为1个字符变量,不知道这样说,你明白没有.
tang688 2008-07-19
  • 打赏
  • 举报
回复
这个变量用作字段的好象可以,但用作表名好象不成功.
我对存储过程不熟,对SQL还熟的.
我在网上查找from @
好象也找不到.
是不是表名不能用这个@型的变量的?
这个变量的定义我看都与字段是一样的.
是不是它只能用作字段类型的啊?!
wantfly2006 2008-07-19
  • 打赏
  • 举报
回复
在考虑功能的同时,你考虑过性能么?
  • 打赏
  • 举报
回复
在SQL语句中表名是否能为可变?
可以使用动态sql



select count(*) from [交易+str(year(getdate())) + str(month(getdate()))]

该为

declare @tbname varchar(20)
set @tbname='交易'+str(year(getdate())) + str(month(getdate()))

exec ('select * from'+@tbname)
wgzaaa 2008-07-18
  • 打赏
  • 举报
回复
虽然用动态语句能实现表名的更换,但仅是产生视图就没有必要,最好是写个存储过程,把表名作参数,供调用。
wzy_love_sly 2008-07-18
  • 打赏
  • 举报
回复
动态sql语句基本语法  
1 :普通SQL语句可以用Exec执行

eg: Select * from tableName
Exec( 'select * from tableName ')
Exec sp_executesql N 'select * from tableName ' -- 请注意字符串前一定要加N

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL

eg:
declare @fname varchar(20)
set @fname = 'FiledName '
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec( 'select ' + @fname + ' from tableName ') -- 请注意 加号前后的 单引号的边上加空格

当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName ' --设置字段名

declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName '
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错


declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName '
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确

3. 输出参数
declare @num int, @sql nvarchar(4000)
set @sql= 'select count(*) from tableName '
exec(@sql)


--如何将exec执行结果放入变量中?

declare @num int, @sql nvarchar(4000)
set @sql= 'select @a=count(*) from tableName '
exec sp_executesql @sql,N '@a int output ',@num output
select @num










wzy_love_sly 2008-07-18
  • 打赏
  • 举报
回复
exec('select * from '+@tbname)

22,209

社区成员

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

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