比如,有表User(UserID,UserName,Password,Nickname),那么我可以指定UserID(主键)和Password来更改密码,也可以指定UserID和Nickname来更改昵称,而不需要理会其他字段。不考虑这种方法:先根据UserID获取整条记录,然后更改密码或昵称,最后将整条记录更新到表。

解决方案 »

  1.   

    没有明白你的意思
    如果UID唯一,直接用UPDATE就行了
    字段名是否知道,从系统表中取?详细说明
      

  2.   

    用字符串拼sql,把要更新的字段当做参数传入
      

  3.   

    不用存储过程都行,
    可以在上面拼sql, 先读取字段的类型。
      

  4.   

    字段名是知道的。
    目的是只用一个 存储过程 就可以更新任意数量的字段。比如,它既可以修改密码,也可以修改昵称,还可以同时修改密码和昵称但不修改用户名。
    客户端调用的时候不拼接SQL语句,只调用存储过程,并传参。
      

  5.   

    如果不拼接SQL语句,无解
    将字段名及类型、值传递给SP,在SP中根据字段名及类型、值拼接SQL语句,再动态执行
      

  6.   

    这个方法不错。不过这样跟在客户端拼接好SQL语句,然后执行没多大区别吧?而且,在客户端拼接应该方便些。
      

  7.   

    一般类似的功能都是在客户端实现的
    比如DataGrid,DataWindow都是自动组织好SQL语句提交的如果实在要求在服务端实现也没办法,但至少要了解这不是一个好的解决方案。
      

  8.   

        目的是为了不在客户端出现SQL语句,全部用存储过程。
        但是这有个问题,就是只更新其中某些字段时,不想把所有字段值都传递到服务器,因为这样很可能需要先从数据库获取该记录、而且也增加了网络流量,当然,可以对需要单独更新的字段写对应的存储过程,但是感觉太麻烦了,有很多字段要独立更新的。
        根据7楼的指点,目前打算将表名、字段名(包括主键和待更新的)、类型和值传递给存储过程,再由存储过程拼出SQL语句,然后动态执行。不过,这样客户端这边的数据库访问中间件还是要写很多函数,目的是让上层调用者可以忽视数据库结构,这已经超出本贴讨论范畴。
      

  9.   

    MYSQL5。1以上可以通过 INFORMATION_SCHEMA.COLUMNS 表得到数据类型。select DATA_TYPE
    from INFORMATION_SCHEMA.COLUMNS 
    where TABLE_SCHEMA='DB1' and TABLE_NAME='table1' and COLUMN_NAME='col1'
      

  10.   

    如果是5以上,可以用系统表COLUMNS 取得