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
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
可以使用动态sqlselect count(*) from [交易+str(year(getdate())) + str(month(getdate()))] 该为declare @tbname varchar(20)
set @tbname='交易'+str(year(getdate())) + str(month(getdate()))exec ('select * from'+@tbname)
declare @sql='select count(*) from [交易'+str(year(getdate())) + str(month(getdate()))+']'
exec(@sql)
/*
标题:日期分表查询(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
我对存储过程不熟,对SQL还熟的.
我在网上查找from @
好象也找不到.
是不是表名不能用这个@型的变量的?
这个变量的定义我看都与字段是一样的.
是不是它只能用作字段类型的啊?!
那么就将所有的查询语句,拼接为字符串,然后EXEC执行它,也就是执行动态SQL的意思.
那么这时候你的表名就可以声明为1个字符变量,不知道这样说,你明白没有.
表名可以用@
declared @a table
你这个是定义一个表,而不是一个表名变量.表名可以用字符串,然后EXEC(语句)