SQL Server 的SQL语句中是否可以有动态表名,或者其它实现办法(90)(90分)

  • 主题发起人 主题发起人 懂云
  • 开始时间 开始时间

懂云

Unregistered / Unconfirmed
GUEST, unregistred user!
如:
declare @TableName varchar(30)
select * from @TableName
{是否可以用Format函数实现???}
 
exec 'select * from ' + @TableName
 
exec ('select * from ' + @TableName)
 
declare @tablename varchar(30)
declare @tempcode varchar(30)
declare @destno int
select @tablename=(Select tn_name from tablename)
select @tempcode =(exec('select c_code from '+@tablename+' where C_no=1 '))
我想把一个动态表中某条记录的值赋于一个变量,我用了上面的办法但是失败了,
我想可能是EXEC只能用于语句的开头,我怎样才能将一个动态表中查询出来的值赋予一个
变量呢?还请xWolf 和zwhc及其它网友赐教
 
可以使用游标(光标)
在where循环中使用 fetch next from cursor_name into 变量,...n
具体参看Transact-SQL HELP
 
to ponysam:游标太麻烦了吧,而且速度很慢
to all:难道真没有其它办法了吗?

 
对于这个问题,我曾遇到过,我的解决方法是,建立一个表(Tablename),该表存储在程序
运行期间所自动生成的表名及其一些标志,通过标志可动态取表名
 
好的方法我也没有,我也为类似的问题伤神。 :(

有一个笨方法:建一个临时表,将该记录的值填入临时表,
再取出来。

CREATE TABLE #Table1(
[TempCode] [varchar] (30) NULL
)

...
insert into #Table1
exec('select c_code from '+@tablename+' where C_no=1 ')
...
 
>select @tablename=(Select tn_name from tablename)
>select @tempcode =(exec('select c_code from '+@tablename+' where C_no=1 '))
如果你的第一条语句没有问题,第二条语句就存在以下问题了:
@tablename就象一个视图,此视图中只有一个字段tn_name,
那么c_code以及C_no字段从何而来?
 
to :刘素杰
@tablename is a table name that is stored in another
table whose name is "tablename".and I want to get a field value
from a table that the table's name is just equal to @tablename.
 
这是一个sql server 的sp ,也许你可以参考一下!!
create procedure hi_sp (@_id varchar(10)) as
as
declare
@SQLstmt varchar(1000)
begin
@SQLstmt='select * form '+@_id
exec(@SQLstmt)



 
你用的是什么数据库,我上面所写的是在 M$ SQL Server 7
数据库环境下,用存储过程完成的。
 
to 懂云
和zwhc一样我用的也是sql server 7也用存储过程!
 
实际上
declare @TableName varchar(30)
set @tablename='table1'
select * from @TableName
在sql 运行时会翻译为
select * from 'table1'
而正常可以运行语句为
select * from table
也就是说当将表名或者column定义为varchar形式时在sql翻译后都会在字段名上
加一对‘’----单引号从而与sql定义的格式不符。
报错-“Incorrect syntax near 'table1'”
解决这一问题的方法是消除变量中的引号
上面的各种方法实际上都是基于这一目的

create procedure hi_sp (@_id varchar(10)) as
declare
@SQLstmt varchar(1000)
begin
@SQLstmt='select * form '+@_id
exec(@SQLstmt)

exec ('select * from ' + @TableName)(好像少了一些东西所以运行不了)

当然方法有很多我自己使用的一个方法是
declare @tablename sysname, @sqll sysname
set @tablename='causer'
set @sqll='select * from '+@tablename
EXECUTE sp_executesql @sqll
如果要在程序中调用参数可以
declare @tablename sysname, @sqll sysname
set @tablename=:tablename
set @sqll='select * from '+@tablename
EXECUTE sp_executesql @sqll
设置tablename的形式为ftstring
然后再程序中直接调用就可以了。





 
to 懂云
"declare @tablename varchar(30)
select @tablename=(Select tn_name from tablename)"
以上是你的语句。
只要“Select tn_name from tablename”返回一个记录单元。应该没错。
在我的ms SQL Server 运行通过。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
466
import
I
后退
顶部