做的是.net2.0的项目,用的是SQL 2005。
背景:
现在为了回避 FOR循环 来多次访问数据库,
所以bt客户希望 使用一条SQL语句来更新多条数据。
现状:
现在传到DataAcess层的数据是个dataTable。
格式是:
变量A1 变量B1 变量C1
变量A2 变量B2 变量C2
变量A3 变量B3 变量C3
变量A4 变量B4 变量C4
... ... ...
更新内容(set部分)是固定的。更新的条件(where部分)的字段也是固定的。
大概写成这个意思,
update tableA
set field1 = '1',field2 = '2'
where field3 = 变量Ax and field4 = 变量Bx and field5 = 变量Cx
--这个x是表示变量的意思。
被放弃的思路:
1,因为多条数据,所以不可能用or来串成一个SQL语句来执行,长度会超过限度,出异常。
2,用in肯定也不行,会出现混乱。
请高手指点!!!谢谢!!!
这个问题第1个回答:
在 .net中字符超长?
那做成过程
这个问题第2个回答:
过程也不行,再想想
这个问题第3个回答:
的确是.net的不行,超过8000个字符就挂了。。。这个是理论上的长度。
我们做的时候,也的确挂了,但没数长度是不是8000,估计差不多。
这个问题第4个回答:
使用存储过程吧
这个问题第5个回答:
存储过程不允许用。
理由很简单,数据库是多个系统使用。
一旦一个存储过程出问题,对整个库都有影响。
也影响到其他系统的运作了。
这个问题第6个回答:
把起其所有要更新的Id拼成一个串,传递到存储过程中,然后再分割字符串,操作。可以否?
这个问题第7个回答:
一旦一个存储过程出问题,对整个库都有影响。
是不是你们那里的数据库由DBA来管了,假如是的话,可以请他来写存储过程,像你说的这个问题,我倾向于写存储过程。
这个问题第8个回答:
换个思路换个思路。。。
确认了,不允许用存储过程。。。
这个问题第9个回答:
挺奇怪的.照道理肯定是SP要比直接sql command好.
有方便又安全.
不能用sp.就只能拼字符串了.
我想不到再好的办法.
这个问题第10个回答:
那就禁止他每次提交的修改拼接成SQL后超过8000,谁让他提那么变态的要求-_,-
不知道.net2.0怎么处理,数据库中SQL语句超过8000就分2个变量存储,最后拼接执行
这个问题第11个回答:
数据量大不大,可以考虑用dataset储存,调用时用dataview过滤
如果用户较多,考虑一下cache
这个问题第12个回答:
。。。。哎···
由于受硬件条件的限制,即,服务器上同时有多个系统在运行。
很多东西在开发中都禁止使用的。
比如sql的存储过程,已经ap服务器端的cache。
目前看来,,
各位大侠的回答都不是我想要的答案啊。。。
苦恼啊。。。
这个问题第13个回答:
,以把变量临时生成一个临时表。然后根据表连接更新?
这个问题第14个回答:
看来重点是SQL长度。像下面这样应该可以有所减少:
SQL code
declare @t table(field1, field2, 变量A1, 变量B1, 变量C1)
insert @t values(field1, field2, 变量A1, 变量B1, 变量C1)
insert @t values(field2, field3, 变量A2, 变量B2, 变量C2)
...
update tableA
set field1 = b.field1,field2 = b.field2
from tableA a, @t b
where
a.id = b.id
and a.field3 = b.filed3 ...
这个问题第15个回答:
可以考虑在C#代码中动态创建存储过程。