日期:2014-05-18  浏览次数:20515 次

求教了!怎么用UNION查询2200多个表~~~~
如题,用户在搜索时,会生成一个查询的SQL字符串,再返回查询结果。但如果把生成的SQL语句放在查询分析器里执行,系统会报错说SQL长度超过64K,无法运行。

想向高人讨个想法,我应该怎么设计这个功能。表结构是动不了的,而且里面还有大量的数据。只能通过算法来解决问题。

如果使用存储过程应该怎么设计呢?谢谢了!

------解决方案--------------------

把搜索条件和要求用参数传过去后,在存储过程中再生成 sql 语句。
------解决方案--------------------
写个存储过程,多设计几个冗余varchar(8000)的参数.在存储过程中判断每个参数是否为空,把不为空的参数连接起来,然后exec().
应用程序端控制一下,将查询字符串分解成多个小于8000字节的字符串,把这些字符串作为存储过程的参数.
例如:
create proc sq_query @str1 varchar(8000),@str2 varchar(8000),@str3 ...
as
EXEC(isnull(@str1, ' ') + isnull(@str2, ' ') + isnull(@str3, ' ') + ...)
GO
------解决方案--------------------
化解字符串不能超过8000的方法及交叉表的处理

看看我们老大的吧:
http://blog.csdn.net/zjcxc/archive/2003/12/29/20075.aspx
------解决方案--------------------
抱歉,更正一下,exec()中不能包含函数,只能是字符串变量,上面的回复更正一下:
create proc sq_query @str1 varchar(8000),@str2 varchar(8000),@str3 ...
as
set @str1 = isnull(@str1, ' ')
set @str2 = isnull(@str2, ' ')
set @str3 = isnull(@str3, ' ')
set ...
EXEC(@str1 + @str2 + @str3 + ...)
GO

------解决方案--------------------
SQL SERVER2005:
declare @s varchar(max) --此类型足够存储你的2200个表的union 字符串
set @s= '... '
exec(@s)
------解决方案--------------------
我自己设计了一个存储过程:
CREATE PROC oaAm_query @SearchStr varchar(8000)
AS
EXEC(@SearchStr)

GO

想把生成的SQL查询语句就到里面来查询,得到查询结果。

但现在执行的时候出现错误,

EXEC oaAm_query 'Select * From table1 where file_number like '%11% ' '

我不太会用存储过程,请指教一下。


==========================


EXEC oaAm_query 'Select * From table1 where file_number like ' '%11% ' ' '