动态存储过程
1,先去个简单的例子
declare @name varchar(20) set @name='id' select @name from WG_Logs
在这里用声明变量,替换并查询,结果ok
但是如果我们这样:
declare @name varchar(20) set @name='id' select @name from WG_Logs where @name=1
会报错:消息 245,级别 16,状态 1,第 3 行
在将 varchar 值 'id' 转换成数据类型 int 时失败。
在sql中cast可以转化数据格式,那么是不是这样就可以了呢
select @name from WG_Logs where @name= cast(1 as varchar(2))
结果是:无列明,怎么回事!
要是这样写呢
declare @temp nvarchar(100) declare @name varchar(20) set @name='id' select @name from WG_Logs where Id=1
结果: id,神马情况!
如果这样写
declare @temp nvarchar(100) declare @name varchar(20) set @name='id' select Id from WG_Logs where @name=1
同样有 :消息 245,级别 16,状态 1,第 4 行
在将 varchar 值 'id' 转换成数据类型 int 时失败。 就算改为where @name='1' 也只是显示个id而已。这是怎么回事
可惜我们有查到详细的资料,不过我看到锅这样的一句话,在形如 select Id from WG_Logs where @name=1的语句中,不能出现变量,但在字段列表中是可以存在的
也许这样没有束缚力,我们就先姑且这样认为吧
2.要是我们想实现上面的效果我们该怎么办呢?sql提供给我们可以拼接字符串
declare @id varchar(3) ='id' declare @tableName varchar(10)='wg_logs' declare @tempSql nvarchar(max)='' set @tempSql='select * from '+@tableName +' where '+@id+'=1' exec(@tempSql)--执行sql
print(@tempSql)--打印出select * from wg_logs where id=1
显然可以满足我们的需求,但是这种写法有很大的弊端,你只能exec一段拼接后的sql语句,而不能取得其中的值,做其他操作。
3.如何取出某个值呢
set @tempsql='select '+@sortField+' as t into ##tempTable from '+@tabelName+ ' where '+@keyFiled+'='+cast(@keyValue as varchar(3))+'' --选择出当前排序编号 exec(@tempsql) select @currentOrderId=t from ##tempTable --从临时表中选择出排序编号 drop table ##tempTable --删除临时表
具体用法,请看上上篇http://www.cnblogs.com/fjsnail/p/3225352.html
在这篇中有写如何取出单个值,做下部操作!
主要用临时表的方法,别忘了最后要drop一下。
着这里顺便提一些值得注意的地方:
1:##temptable是一个系统临时变量,
2:cast语法可以转化各种不同格式的数据
3:要为临时表添加字段名,不然很难选择出来'select '+@sortField+' as t into ##tempTable (t就是临时表的字段名)
当然我们也可以显示创建临时表
declare @sql nvarchar(max) declare @all int create table #tempTable(id int) --申明临时表(表明和表字段) set @sql='select count(id) as recourd from wg_logs' insert into #tempTable exec(@sql) --(这里可以看成是表的复制insert into values(..) select ..)插入临时表 set @all=(select id from #tempTable ) --从临时表中选择出来 drop table #tempTable print @all
显然这种方法要麻烦的多,第一种方法更好。
http://www.cnblogs.com/RascallySnake/archive/2010/05/20/1739839.html
在这篇博客中有讲到:exec(sql1+sql2),即在exec不能存在变量的sql语句,可以是sql语句的拼接
对于exec sp_executesql的解释,上篇博客写的非常好,大家可以借鉴