sql-server – 您是否遇到SQL Server无法执行的查询,因为它引用了太多的表?

你有没有看到任何错误信息?

sql Server 2000

Could not allocate ancillary table for view or function resolution.
The maximum number of tables in a query (256) was exceeded.

sql Server 2005

Too many table names in the query. The maximum allowable is 256.

如果是,你做了什么?

放弃了?说服客户简化需求?对数据库进行非规范化?

@(每个人都希望我发布查询):

>我不知道我是否可以在答案编辑窗口中粘贴70千字节的代码.
>即使我可以这样做,这不会有帮助,因为这个70千字节的代码将引用20或30个视图,我也必须发布,否则代码将是无意义的.

我不想听起来像我在这里吹嘘,但问题不在于查询.查询是最优的(或至少几乎最优).我花了无数次优化他们,寻找每一个单独的列和每个可以删除的表.想象一下,有一个200或300列需要填充一个SELECT语句的报表(因为几年前它仍然是一个小报告).

解决方法

对于sql Server 2005,我建议您使用表变量并部分构建数据.

为此,创建一个表变量,表示您要发送给用户的最终结果集.

然后找到您的主表(例如上面的示例中的订单表),并拉取该数据,再加上一点只是说一个加入的补充数据(客户名称,产品名称).你可以做一个SELECT INTO把它直接放在你的表变量中.

从那里,遍历表和每行,执行一堆小型SELECT查询,以检索您的结果集所需的所有补充数据.随时随地将它们插入各列.

完成后,您可以从表变量中执行简单的SELECT *,并将该结果集返回给用户.

我没有任何硬编号,但是我已经有三个不同的实例,迄今为止,做这些较小的查询的实际工作速度比使用大量联接的大量选择查询的速度更快.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...