none
变量作用域的问题--在线等 RRS feed

  • 问题

  • 我是在写一个工资管理系统,因为工资项目是用户可以随意增加的,用户每增加一个工资项,在数据库中工资发放表中就相应增加列,但当用户想删某个工资项目时,我需要检查这个工资项目是否已经有发放的数据,如果有,就不能删这个列,
    以下是删除列之前的角本,但提示     "消息 137,级别 15,状态 2,第 8 行 ,必须声明变量 '@tbl_name'。"

    declare @gz_no varchar(10),   --工资项目,也是列名
            @cmd_text varchar(200),
            @tbl_name varchar(10)
    select @gz_no='jbgz'               --jbgz意:基本工资
    select @tbl_name ='#tptbl'+ cast(datepart(ms,getdate()) as varchar(3))  --临时表名
    select @cmd_text='select top 1 *  into '+@tbl_name +' from current_gz where ' +@gz_no+ ' is null'
    exec (@cmd_text)  --直到这里执行都可以
    if exists(select * from @tbl_name) --此句开始就不执行了, @tbl_name超过作用域了?
    print 'have data'

    请给指点一下
    • 已编辑 nswdwy 2009年10月31日 8:37 在线等
    2009年10月31日 8:36

答案

全部回复

  • if exists(select * from @tbl_name) --@tbl_name是字符变量名,不可以这样用的。
    -->试改为
    if @@rowcount>0
    • 已标记为答案 nswdwy 2009年10月31日 9:14
    2009年10月31日 9:12
  • 对于表名使用变量时,应该使用动态SQL的语法,EXEC(SQLTEXT),其中SQLTEXT就是要执行的SQL字串,
    Ex: EXEC('select * from '+ @tbl_name) 
          If @@rowcount>0  --使用系统全局变量,返回最近一次执行SQL的影响行数。
          --SQL1---
          else
          ---SQL2---

    2009年11月10日 4:35
  • select * from @tbl_name
    select语句不执行动态表名
    2009年11月11日 5:00