日期:2014-05-18  浏览次数:20439 次

求一存储过程....
我想动态对表进行查询,我写的如下:
create   proc   test
@tabName   nvarchar(100)
as
select   *   from   @tabName

不好使...请会的指教....

目的是为了在程序中能传一参数给这个表名,就能取到这个表的信息....

------解决方案--------------------
按下面的方法搞定:
1.创建存储过程
ALTER proc [dbo].[test]
@tabName nvarchar(100)
as
declare @strExec nvarchar(500)
set @strExec = 'select * from ' + @tabName
exec (@strExec) --注意此处,如果没有()将把@strExec字符串当作存储过程处理

2.测试Pubs数据库,我们访问其Jobs表. 打开查询分析器,执行下面语句:
exec test 'jobs ' --注意: 'jobs '不要引入()中,否则出错
------解决方案--------------------
1。
无法对 FROM 子句使用参数,只有拼接动态 SQL 语句,并用 EXEC 或者 sp_exectueSql 执行

2。
create proc test
@tabName nvarchar(100)
as
declare @sql nvarchar(2000)
set @sql = 'select * from ' + @tabName
-- exec @sql
-- OR
exec sp_executeSql @sql

3。
推荐调用系统存储过程 sp_executeSql, 因为在 sp_executesql 中,Transact-SQL 语句的实际文本在两次执行之间未改变,所以查询优化器应该能将第二次执行中的 Transact-SQL 语句与第一次执行时生成的执行计划匹配。这样,SQL Server 不必编译第二条语句。