none
关于select列的一些疑问 RRS feed

  • 问题

  • 因为要对表的列做相应的数学操作,所以会编辑成一个串的形式放入查询中检测,如果没有错误,那么说编辑的公式就是正确的,否则提示错误。现在呢,一般的错误都能检测到,经过我的反复测试,发现有些错误还是检测不到,比如: select 333奖金 from table

    在333与奖金之间根本就没有空格,但他视为空格了,所以奖金就成了字段别名。造成检测失误,我想给字段都带上[],但是这里是一个计算公式,加上[]有些麻烦,而且,根据算法,我最多只能在项上加[],得到的结果也许是 select 333[奖金] from table 这样还是检测不到这个错误。

    2010年8月21日 1:05

答案

  • 呵呵,问题 的答案我已经找到,很简单,不用任何判断,强制验证字段的正确性:

    select 1基本工资 as ttt from table 

    加上一个as别名,这样就会报错了,得到我想要的啦,不过,还是感谢各位给予的热心帮助,谢谢。

    2010年8月23日 0:12

全部回复

  • 如果你使用的是2000数据库,那么最好考虑到[]问题,05的话对这个比较宽松。至少我这么认为,不过严格起来都应该将字段名或表名都加入[],以上问题如果是在存储过程中我不知道如何实现。通常我的方法是在程序中实现,然后经参数传递到T-Sql语句中进行处理,以下是我以前做过的例子,如果你感兴趣不妨参照一下,或许对你的问题有所帮助

     


    CREATE proc [proc_aboutAdd]

    @text ntext,@opter nchar(10),@pkey nchar(10),@field nchar(10)

    as



    if(@opter='insert')
       begin
          if(@pkey='nonull')--如果@pkey有值,说明其他字段已经被写值,就不能插入。改成更新,否则会新插入一行,与实际情况相违背
            begin
    --  这里是05写法          update tb_other set '''+@field+'''=@text,img=@imgpath
        Exec('update tb_other set '+@field+'= '''+@text+'''')
        end
       else
            begin
        Exec('insert tb_other('+@field+') values '''+@text+'''')
                    end
        end

    else
       begin
        Exec('update tb_other set '+@field+'= '''+@text+'''')
       end



    GO

     

    其中的变量@fileld就是后台代码传递过来的列名,当然在传递之前你可以为其加入[]或多字段空格分开

     

     

    2010年8月21日 2:20
  • 加[]有难度,因为不知道加在什么地方,就算我设计的有项目表,那也只能加在对应项上:我写一段伪代码:

    declare @str varchar(100)

    set @str='233基本工资+奖金+提成'--这个@str是取自前台文本框,用户任意编辑的东东啊。

    用一个replace函数循环替换,最终,可能会这样:@str='233[基本工资]+[奖金]+[提成]'

    不可能的是这个结果:'[233基本工资]+[奖金]+[提成]' ,而且这个233可以出现在任意位置。

    select @str from table

     

    2010年8月21日 3:27
  • 加[]有难度,因为不知道加在什么地方,就算我设计的有项目表,那也只能加在对应项上:我写一段伪代码:

    declare @str varchar(100)

    set @str='233基本工资+奖金+提成'--这个@str是取自前台文本框,用户任意编辑的东东啊。

    用一个replace函数循环替换,最终,可能会这样:@str='233[基本工资]+[奖金]+[提成]'

    不可能的是这个结果:'[233基本工资]+[奖金]+[提成]' ,而且这个233可以出现在任意位置。

    select @str from table

     

    其中的233 基本工资 奖金 提成 都是数据库对应的字段名么? 这些关键字还有可能成为其他字符么?顺便说一下你想做的功能是什么?(要实现什么样的效果)

    2010年8月21日 3:50
  • 对 "select 333奖金 from table" 的结果集做验证, 按照你的需求, 你是要定义一个计算出结果的公式, 那么这个公式的结果集应该只有一个不包含列名的结果, 如果不满足这个, 那么公司定义有问题, 这样可以检测到你描述的这种问题
    2010年8月21日 4:24
  • 对结果集做验证?我是直接在表用的,如果表中有数据,只怕这个结果集验证有难度了。

    2010年8月21日 4:44
  • 加[]有难度,因为不知道加在什么地方,就算我设计的有项目表,那也只能加在对应项上:我写一段伪代码:

    declare @str varchar(100)

    set @str='233基本工资+奖金+提成'--这个@str是取自前台文本框,用户任意编辑的东东啊。

    用一个replace函数循环替换,最终,可能会这样:@str='233[基本工资]+[奖金]+[提成]'

    不可能的是这个结果:'[233基本工资]+[奖金]+[提成]' ,而且这个233可以出现在任意位置。

    select @str from table

     

    其中的233 基本工资 奖金 提成 都是数据库对应的字段名么? 这些关键字还有可能成为其他字符么?顺便说一下你想做的功能是什么?(要实现什么样的效果)


    如果你单纯想把233加在基本工资前面的的话,用程序处理一下,不就可以了么?取出字符串里的数字项,经过拼拼凑我想得到你想要的效果并不是什么难事吧

     

    • 已标记为答案 fangyanqin 2010年8月21日 5:32
    • 取消答案标记 fangyanqin 2010年8月21日 5:32
    2010年8月21日 4:54
  • 加[]有难度,因为不知道加在什么地方,就算我设计的有项目表,那也只能加在对应项上:我写一段伪代码:

    declare @str varchar(100)

    set @str='233基本工资+奖金+提成'--这个@str是取自前台文本框,用户任意编辑的东东啊。

    用一个replace函数循环替换,最终,可能会这样:@str='233[基本工资]+[奖金]+[提成]'

    不可能的是这个结果:'[233基本工资]+[奖金]+[提成]' ,而且这个233可以出现在任意位置。

    select @str from table

     

    其中的233 基本工资 奖金 提成 都是数据库对应的字段名么? 这些关键字还有可能成为其他字符么?顺便说一下你想做的功能是什么?(要实现什么样的效果)


    如果你单纯想把233加在基本工资前面的的话,用程序处理一下,不就可以了么?取出字符串里的数字项,经过拼拼凑我想得到你想要的效果并不是什么难事吧

     


    你搞误会了!这里是做检测,编辑公式正确性,不知道你有没仔细看我问题描述的。
    2010年8月21日 5:35
  • 对 "select 333奖金 from table" 的结果集做验证, 按照你的需求, 你是要定义一个计算出结果的公式, 那么这个公式的结果集应该只有一个不包含列名的结果, 如果不满足这个, 那么公司定义有问题, 这样可以检测到你描述的这种问题


    这个想法很好的,但是,还是不能确定,首先,工资表每月有操作员人工创建,这时表中未必有数据。即便是有数据,也难以确定结果的正确性,把1作为正确标志:用户可以这样输入逃脱检测:select 1基本工资 from table。用结果集比较,可能难解决了

    2010年8月21日 5:59
  • sql有点趣味啊:

    select  1基本工资 from table  正确==我想在这里,能不能配置一下数据库,让它强制检测列名,而不是当成一个别名了。其实,只要他报列名错误,那么我要的效果也就达到了

    select 基本1工资 from table  列名错误

    select 基本工资1 from table 列名错误

     

    2010年8月21日 6:08
  • 呵呵,问题 的答案我已经找到,很简单,不用任何判断,强制验证字段的正确性:

    select 1基本工资 as ttt from table 

    加上一个as别名,这样就会报错了,得到我想要的啦,不过,还是感谢各位给予的热心帮助,谢谢。

    2010年8月23日 0:12