存储过程中表名是否可以为变量(50分)

  • 主题发起人 主题发起人 xyqjb
  • 开始时间 开始时间
X

xyqjb

Unregistered / Unconfirmed
GUEST, unregistred user!
select from 表名(表名可以为变量吗)
ado中可以实现,存储过程中可以吗?请各位大哥哥指点
 
不可以!除非TQUERY动态建立存储过程,否则数据库端不可以!

我是以ORACLE来说,参数只能在where句中表达式的右边!

name=aa 而不能 aa=20 (aa参数),其它数据库不祥,也听课!
 
可以的。
在SQL Server 2000中:
select sql='select * from '+tablename
exec(sql)

 
我知道在sqlserver中是可以的
 
SQL SERVER中完全可以.下面是我的一段现实中使用的存储过程:
/*建立临时表用于工资调整的过程*/
/*该临时表应包括员工要素及其各项工资的发放金额*/
CREATE PROCEDURE Sp_Create_Temp_Table
@tableName Char(10),
@operation integer, /*1--创建 2---删除 3--装入数据*/
@isall bit, -------------如果全部人员=1
@bmbh integer
AS
Declare @tt varchar(7777)
if @Operation=2
Begin

Select @tt=N' drop table '+ @tableName
Exec(@tt)

End

if @operation=1
Begin

Select @tt=N' create table '+@tableName+' ( 选取 bit,员工编号 char(10),员工姓名 char(10),部门编号 char(10),部门名称 char(10),'

/*创建游标来进行表的建立*/
Declare @hmmc char(20)
Declare je_CurSor Cursor For
Select hmmc from tu_gzhm where inserting>0 order by hmbh
Open je_CurSor

FETCH NEXT FROM je_Cursor into @hmmc
WHILE @@FETCH_STATUS = 0
BEGIN
select @tt=@tt +@hmmc +N' money,'
FETCH NEXT FROM je_CurSor into @hmmc
END
CLOSE je_Cursor
DEALLOCATE je_Cursor
select @tt=Substring(@tt,1,len(@tt)-1)
select @tt=@tt+N')'
Exec(@tt)

End

IF @operation=3 --------------装入数据
Begin
/*检查是否有上次发薪数据*/



/*没有就以基准工资排列*/
select @tt=N' insert into '+@tableName
select @tt=@tt+N' select 0,y.ygbh,y.ygmc,b.bmbh,b.bmmc, '

Declare @hm char(20),@hmje money
Declare je_CurSor Cursor For
Select hmmc,jcgz from tu_gzhm where inserting>0 order by hmbh
Open je_CurSor

FETCH NEXT FROM je_Cursor into @hm,@hmje
WHILE @@FETCH_STATUS = 0
BEGIN

Select @tt=@tt+N' cast('+rtrim(ltrim(cast(@hmje as Char(20))))+' as Money),'
FETCH NEXT FROM je_CurSor into @hm,@hmje
END
CLOSE je_Cursor
DEALLOCATE je_Cursor
select @tt=Substring(@tt,1,len(@tt)-1)


if @isall=1
select @tt=@tt+N' From
tu_empl y left join tu_bmbh b on y.bmbh=b.bmbh and y.inserting>0 and b.inserting>0'
else
select @tt=@tt+N' From
tu_empl y left join tu_bmbh b on y.bmbh=b.bmbh and y.bmbh='+@bmbh+' and y.inserting>0 and b.inserting>0'


Exec(@tt)
Select @tt=N' select * from '+@tableName


Exec(@tt)

End
GO
 
oralce也是可以的,下面是oracle执行动态sql的代码:

FUNCTION Evl
/*
返回表达式的值
*/
( express IN VARCHAR2 DEFAULT 'NaN')
RETURN NUMBER IS
cursor_handle NUMBER;
v_ret NUMBER;
v_sql VARCHAR2(1000);
endvalue NUMBER;

BEGIN
cursor_handle := dbms_sql.open_cursor;
v_sql:='select '||express||' from dual';
dbms_sql.parse(cursor_handle,v_sql,dbms_sql.v7);
DBMS_SQL.DEFINE_COLUMN(cursor_handle,1,endvalue);
v_ret := DBMS_SQL.EXECUTE(cursor_handle);
v_ret := DBMS_SQL.FETCH_ROWS(cursor_handle);
DBMS_SQL.COLUMN_VALUE(cursor_handle,1,endvalue);
dbms_sql.CLOSE_CURSOR(cursor_handle);
RETURN endvalue;
END;


唯一的问题是返回值的形式比较特殊,可能用起来不一定顺手.
 
用@就可以了
 
无论何种数据库,这种用法都是需要动态SQL来完成的!
只是在实现手段上各有不同,SQL SERVER上比较简单,而ORACLE上稍微复杂一些。
 
后退
顶部