如何做到只用一个存储过程就可以更新表中的任意字段? 比如,有表User(UserID,UserName,Password,Nickname),那么我可以指定UserID(主键)和Password来更改密码,也可以指定UserID和Nickname来更改昵称,而不需要理会其他字段。不考虑这种方法:先根据UserID获取整条记录,然后更改密码或昵称,最后将整条记录更新到表。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有明白你的意思如果UID唯一,直接用UPDATE就行了字段名是否知道,从系统表中取?详细说明 用字符串拼sql,把要更新的字段当做参数传入 不用存储过程都行,可以在上面拼sql, 先读取字段的类型。 字段名是知道的。目的是只用一个 存储过程 就可以更新任意数量的字段。比如,它既可以修改密码,也可以修改昵称,还可以同时修改密码和昵称但不修改用户名。客户端调用的时候不拼接SQL语句,只调用存储过程,并传参。 如果不拼接SQL语句,无解将字段名及类型、值传递给SP,在SP中根据字段名及类型、值拼接SQL语句,再动态执行 这个方法不错。不过这样跟在客户端拼接好SQL语句,然后执行没多大区别吧?而且,在客户端拼接应该方便些。 一般类似的功能都是在客户端实现的比如DataGrid,DataWindow都是自动组织好SQL语句提交的如果实在要求在服务端实现也没办法,但至少要了解这不是一个好的解决方案。 目的是为了不在客户端出现SQL语句,全部用存储过程。 但是这有个问题,就是只更新其中某些字段时,不想把所有字段值都传递到服务器,因为这样很可能需要先从数据库获取该记录、而且也增加了网络流量,当然,可以对需要单独更新的字段写对应的存储过程,但是感觉太麻烦了,有很多字段要独立更新的。 根据7楼的指点,目前打算将表名、字段名(包括主键和待更新的)、类型和值传递给存储过程,再由存储过程拼出SQL语句,然后动态执行。不过,这样客户端这边的数据库访问中间件还是要写很多函数,目的是让上层调用者可以忽视数据库结构,这已经超出本贴讨论范畴。 MYSQL5。1以上可以通过 INFORMATION_SCHEMA.COLUMNS 表得到数据类型。select DATA_TYPEfrom INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA='DB1' and TABLE_NAME='table1' and COLUMN_NAME='col1' 如果是5以上,可以用系统表COLUMNS 取得 mysql 查询(想不出方法来,看看各位的SQL) 资金数据库有什么注意事项? 用什么工具查看扩展名为db4的数据库? 自动增长类型怎么设置默认值 CONCAT()+GROUP_CONCAT()出现乱码了,帮忙看看........ mysql4.0乱码问题 求一sql语句 mysql.com上可以下载的的那个MyODBC是什么工具? 请问一个关于权限的问题.... mysql limit 导致索引选择 问题 一条sql语句 asp连接mysql字符串 怎么写呢?
如果UID唯一,直接用UPDATE就行了
字段名是否知道,从系统表中取?详细说明
可以在上面拼sql, 先读取字段的类型。
目的是只用一个 存储过程 就可以更新任意数量的字段。比如,它既可以修改密码,也可以修改昵称,还可以同时修改密码和昵称但不修改用户名。
客户端调用的时候不拼接SQL语句,只调用存储过程,并传参。
将字段名及类型、值传递给SP,在SP中根据字段名及类型、值拼接SQL语句,再动态执行
比如DataGrid,DataWindow都是自动组织好SQL语句提交的如果实在要求在服务端实现也没办法,但至少要了解这不是一个好的解决方案。
但是这有个问题,就是只更新其中某些字段时,不想把所有字段值都传递到服务器,因为这样很可能需要先从数据库获取该记录、而且也增加了网络流量,当然,可以对需要单独更新的字段写对应的存储过程,但是感觉太麻烦了,有很多字段要独立更新的。
根据7楼的指点,目前打算将表名、字段名(包括主键和待更新的)、类型和值传递给存储过程,再由存储过程拼出SQL语句,然后动态执行。不过,这样客户端这边的数据库访问中间件还是要写很多函数,目的是让上层调用者可以忽视数据库结构,这已经超出本贴讨论范畴。
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA='DB1' and TABLE_NAME='table1' and COLUMN_NAME='col1'