表变量作为存储过程

 动态SQL语句的一些常见写法  
   
   
   
   
  1:普通SQL语句可以用Exec 执行  
   
  eg:       Select   *   from   tableName  
              Exec('select   *   from   tableName')  
              sp_executesql   N'select   *   from   tableName'         --   请注意字符串前一定要加N  
   
  2:字段名,表名, 数据库 名之类作为变量时,必须用动态SQL  
   
  eg:        
  declare   @fname   varchar(20)    
  set   @fname   =   '[name]'  
  Select   @fname   from   sysobjects                                           --   错误  
  Exec('select   '   +   @fname   +   '   from   sysobjects')           --   请注意   加号前后的   单引号的边上要加空格  
  exec   sp_executesql   N'   select   '   +   @fname   +   '   from   sysobjects'    
   
  当然将字符串改成变量的形式也可  
          declare   @s   varchar(1000)  
          set   @s   =   'select   '   +   @fname   +   '   from   sysobjects'  
          Exec(@s)                                 --   成功  
          exec   sp_executesql   @s       --   此句会报错  
   
          declare   @s   Nvarchar(1000)     --   注意此处改为nvarchar(1000)  
          set   @s   =   'select   '   +   @fname   +   '   from   sysobjects'  
          Exec(@s)                                 --   成功          
          exec   sp_executesql   @s       --   此句正确,  
   
  3:   输出参数  
   
  eg:  
  declare   @num,  
                  @sqls  
  set   @sqls='select   count(*)   from     '   +   @servername   +   '.a.dbo.b'  
  exec(@sqls)  
  我如何能将exec执行的结果存入变量@num中  
   
  declare   @num   int,  
                  @sqls   nvarchar(4000)  
  set   @sqls='select   @a=count(*)   from   '+@servername+'.a.dbo.b'  
  exec   sp_executesql   @sqls,N'@a   int   output',@num   output  
  select   @num   
   
楼主说的表变量是
1.
declare @t table(id int)
还是
2.
declare @tbname varchar(20)
set @tbname = 'tablename'
啊?
如果是1的话存储过程不支持,可将数据存到实体表,再将表名传给存储过程.如果2的话支持,例如:
create proc up_test(@tbname varchar(20))
as
exec('select * from '+@tbname)
GO
--调用
declare @tbname varchar(20)
set @tbname = 'tablename'
exec up_test @tbname

存储过程不支持的
可以考虑使用用户定义函数来实现,如:
CREATE FUNCTION Order_Customer
 (@FirstName varchar(20),@LastName varchar(20))
RETURNS @Order_Customer_Tab TABLE
 (
  OrderID int,
  GoodsName varchar(20),
  CustomerName varchar(40)
 )
BEGIN
INSERT @Order_Customer_Tab
SELECT OrderID,GoodsName,FirstName+','+LastName
FROM Orders JOIN Customers ON Orders.CustomerID = Customers.CustomerID
WHERE FirstName = @FirstName AND LastName = @LastName
RETURN
END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值