在开发应用时,有时需要使用动态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;
阅读(4541) | 评论(0) | 转发(0) |