zoukankan      html  css  js  c++  java
  • 动态存储过程

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

  • 相关阅读:
    Winefish-GTK LaTeX 编辑器
    GPuTTY:SSH 会话治理器
    Zudeo──高清版 Youtube
    HardInfo-体系信息搜集对象
    Liferea 1.2.0 正式版
    HomeBank:家庭理财软件
    ParolaPass:暗码天生器
    VLC Media Player 0.8.6
    流程图的绘制方法
    Delphi 2009 中的匿名方法(reference to)
  • 原文地址:https://www.cnblogs.com/fjsnail/p/3225558.html
Copyright © 2011-2022 走看看