动态存储过程

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的解释,上篇博客写的非常好,大家可以借鉴

原文地址:https://www.cnblogs.com/fjsnail/p/3225558.html