Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1560066
  • 博文数量: 201
  • 博客积分: 2812
  • 博客等级: 少校
  • 技术积分: 3029
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-18 18:28
个人简介

从事数据库工作多年,目前看好分布式NeSQL/HTAP数据库在企业客户市场的发展。未来的主要方向是——致力于 NewSQL/HTAP 数据库的推广普及。

文章存档

2016年(1)

2015年(8)

2014年(23)

2013年(50)

2012年(32)

2011年(87)

分类: Sybase

2012-03-09 20:01:31

   在开发应用时,有时需要使用动态sql以实现某种灵活性。下面给出了一个在IQ中的实现动态SQL的示例,这个例子基于IQ Demo数据库:
 
begin
    declare @sqlString varchar(100);
    declare @tableName varchar(100);
    set @tableName = 'emp1';
    set @sqlString = 'select top 2 * from  ' + @tableName + ' order by salary';   
    execute immediate with result set on @sqlString;
end;
   说明:在IQ中,执行动态sql语句是通过execute immediate语句实现的。如果执行的语句返回结果集,必须增加 "with result set on"子句,否则在运行时会报“Result set not permitted in '' ” 错误。
 
    下面是一个不返回结果集的例子(在存储过程中使用动态sql):
create procedure crt_tabs_proc(in @tableNamePrifix varchar(30),in @tableCount int)
begin
    declare @loopCounter int;
    declare @sqlString varchar(100);
    set @loopCounter = 1;
    while @loopCounter <= @tableCount loop
      set @sqlString = 'create table ' + @tableNamePrifix + '_' + cast(@loopCounter as varchar(10)) + '(col1 int, col2 char(8),col3 char(8))';  
      set @loopCounter = @loopCounter +1;
      execute immediate @sqlString;
    end loop;
end;
   
    说明:上面的例子实现了创建指定个数和指定表名前缀的功能。由于create table 并不返回结果集,所以使用execute immediate @sql的方式执行动态sql。
 
    在看另一个例子:
begin
    declare @sqlString varchar(100);
    declare @tableName varchar(100);
    set @tableName = 'table01' + dateformat(dateadd(hh,-1,now()),'mmddhh');
    set @sqlString = 'select top 1 * from  ' + @tableName + ' order by salary';
    execute immediate with result set on @sqlString;
    --execute immediate @sql_text
end;
阅读(4303) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~