在程序中拼接的SQL语句条件过长时该如何处理?求大神。

时间:2022-09-21 00:13:33
分组统计,因为分组的对象和对象的时间要作为查询条件,在拼接的时候条件过长(长到报错:内部错误 : 达到了表达式服务限制。请在您的查询中查找潜在的复杂表达式,并尝试简化它们),该如何优化呢?可能我实现思路有问题吧,求大神给个思路。
例如:表A 字段如下 Name   DataUploadDate Value
SELECT Name,SUM(Value) FROM A
WHERE (Name = '测试一' AND DataUploadDate >= '2017-04-01' AND DataUploadDate <= '2017-04-30') OR  (Name = '测试二' AND DataUploadDate >= '2017-03-01' AND DataUploadDate <= '2017-03-31') .......

9 个解决方案

#1


分几次查,然后查询结果在程序里再合并

话说你这个sql拼接是多长啊,都达到了sql字数限制

#2


多个 时间取交集,生成一个时间

#3


该回复于2017-04-30 23:55:49被版主删除

#4


想写一个sql语句,很长,主要是in后跟着无数个用户ID,(虽然实现方式很低级,但是还是凑合着用吧)

不知道sql最大长度是多少,看了 SQL Server 的最大容量规范,写的是

包含 SQL 语句的字符串的长度(批大小)的最大大小/数量:65,536 * 网络数据包大小

网络数据包大小是啥东东?你就不能明说最大长度吗是几吗? 微软,你就欺负我不懂TCP吧!

好吧,你不说,我自己测试。

写了一个字符串函数,形成 N个Guid字符串(相当于N*32长度),

然后用select * from table where id in (字符) 执行

1万个Guid字符串,在查询分析器通过,OK,看来支持32万长度(320K)

再加个数量级到10万个,也OK!支持3.2M长度

在加个数量级到100万个,也OK!!支持32M长度,不过太慢了,sql执行了5分钟才返回结果

在加个数量级到1000万个,也OK!!!支持320M长度,用了1小时3分钟才返回结果

没有时间,也没有必要做进一步测试了,

反正如果sql采用In('guid','guid','guid')结构,则至少支持长度guid的个数为1000万个,总字符长度为3.2亿,320M

结论是你就放心用吧,你这一辈子恐怕是遇不到超出32000万字节长度的sql语句了!
引用别人的一下。。。。。 在程序中拼接的SQL语句条件过长时该如何处理?求大神。

#5


试试这个,看看能不能超了
SELECT Name,SUM(Value) FROM A
WHERE (Name = '测试一' AND CONVERT( VARCHAR(7), DataUploadDate, 120 )  = '2017-04') OR  (Name = '测试二' AND CONVERT( VARCHAR(7), DataUploadDate, 120 ) = '2017-03' ) ....................

#6


用view能解决么?

#7


如果你这个条件是无法估计的,那只能分开查询,最后合在一起,
可以在代码里写,也可以创建存储过程,在数据库层面写

#8


引用
用view能解决么?


引用 6 楼 DOwnstairs 的回复:
用view能解决么?

我这个主要是条件太长了,视图解决不了。

#9


我试试分次查询吧。谢谢大家了,散分结贴了。

#1


分几次查,然后查询结果在程序里再合并

话说你这个sql拼接是多长啊,都达到了sql字数限制

#2


多个 时间取交集,生成一个时间

#3


该回复于2017-04-30 23:55:49被版主删除

#4


想写一个sql语句,很长,主要是in后跟着无数个用户ID,(虽然实现方式很低级,但是还是凑合着用吧)

不知道sql最大长度是多少,看了 SQL Server 的最大容量规范,写的是

包含 SQL 语句的字符串的长度(批大小)的最大大小/数量:65,536 * 网络数据包大小

网络数据包大小是啥东东?你就不能明说最大长度吗是几吗? 微软,你就欺负我不懂TCP吧!

好吧,你不说,我自己测试。

写了一个字符串函数,形成 N个Guid字符串(相当于N*32长度),

然后用select * from table where id in (字符) 执行

1万个Guid字符串,在查询分析器通过,OK,看来支持32万长度(320K)

再加个数量级到10万个,也OK!支持3.2M长度

在加个数量级到100万个,也OK!!支持32M长度,不过太慢了,sql执行了5分钟才返回结果

在加个数量级到1000万个,也OK!!!支持320M长度,用了1小时3分钟才返回结果

没有时间,也没有必要做进一步测试了,

反正如果sql采用In('guid','guid','guid')结构,则至少支持长度guid的个数为1000万个,总字符长度为3.2亿,320M

结论是你就放心用吧,你这一辈子恐怕是遇不到超出32000万字节长度的sql语句了!
引用别人的一下。。。。。 在程序中拼接的SQL语句条件过长时该如何处理?求大神。

#5


试试这个,看看能不能超了
SELECT Name,SUM(Value) FROM A
WHERE (Name = '测试一' AND CONVERT( VARCHAR(7), DataUploadDate, 120 )  = '2017-04') OR  (Name = '测试二' AND CONVERT( VARCHAR(7), DataUploadDate, 120 ) = '2017-03' ) ....................

#6


用view能解决么?

#7


如果你这个条件是无法估计的,那只能分开查询,最后合在一起,
可以在代码里写,也可以创建存储过程,在数据库层面写

#8


引用
用view能解决么?


引用 6 楼 DOwnstairs 的回复:
用view能解决么?

我这个主要是条件太长了,视图解决不了。

#9


我试试分次查询吧。谢谢大家了,散分结贴了。