SQL存储过程的参数是否可以带表名(table)? 及在过程中如何使用? (100分)

  • 主题发起人 主题发起人 gondsoft
  • 开始时间 开始时间
G

gondsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
建立一个存储过程,过程执行中的表由参数指定,这一问题如何解决..?
代码:
create proc sp_getID(@tableName 该用何类型?)
select 复杂代码 from 如何使用变量?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1096988
 
好象表名不能做参数
 
我只知道表名不能做参数
 
create proc sp_getID(@tableName varchar(50) as
declare @strsql varchar(200)
set @strsql='select 复杂代码 from '+@tablename
execsql(@strsql)
 
如果能用,类型是varchar(XXX),动态SQL在存储过程中用,我没用过。
这样存储过程运行一次,无需再编译的特性还能在吗?
 
ugvanxk的做法是正确的,在存储过程动态构造SQL语句,再执行构造出的SQL语句,
但要注意的是长度不能超过4000,即@strsql 最大只能是nvarchar(4000)。
wp_hammer提出的问题不太合理,即然是动态构造了SQL语句,当然不能奢望它无需
再编译,构造出不同的SQL,怎么可能不重新编译呢?
 
多谢各位, ugvanxk的方案我已测试,能够达到要求,不过在测试的过程中发现字段不能用参数
传递,请看代码:
declare @show char(254),@tableName char(254),@fieldName char(254)
//以上变量将来定义在过程的参数中
select @fieldName='serno',@tablename='ti_tran_master'
set @show='select '+@fieldName+' from '+@tablename
exec(@show)
执行出错:
Server: Msg 207, Level 16, State 3, Line 1
Invalid column name 'serno'.
//此列在表中存在 将第三行中的变量@fieldName改为serno显示正确结果
谢谢 xmhch 的进一步解释
 
同意楼上,
 
用SQL语句都可以,用动态SQL
 
CREATE PROCEDURE test @TableName nvarchar(40) AS
declare @S nvarchar(40)
set @S='select * from ' + @TableName
exec sp_executesql @S
GO
 
谢谢各位
 
后退
顶部