首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在联合查询中查找表的总数

在联合查询中查找表的总数
EN

Stack Overflow用户
提问于 2017-04-12 14:27:02
回答 4查看 381关注 0票数 0

我正在写一个代码,支持不同版本的Sybase ASE。我正在使用联合查询,问题是不同版本的Sybase ASE在联合查询中支持不同数量的表。联合查询是动态的,并且将根据服务器中存在的数据库数量来形成。

有没有办法可以找到特定Sybase ASE支持的最大表数?我现在知道的唯一解决方案是使用query获取版本,并从结果中选择版本号,然后在代码中相应地设置版本号。但这不是一个很好的解决方案。我试着检查是否有表存储了这个值,但是没有结果。有没有人能对此提出解决方案?

EN

回答 4

Stack Overflow用户

发布于 2017-05-26 07:56:14

由于这是您在此处重新发布的我的SAP回复,因此我将添加更多注释……

  • 这是一个概念证明,它回答了如何通过T-SQL获取信息的基本问题;它假设任何实际寻求实现该解决方案的人都将(最终)解决各种问题re:开销/维护,例如...
  • 设置跟踪文件将需要执行此操作的权限;哪些权限取决于您是否启用了粒度权限(请参阅参考手册中'set tracefile‘命令的注释);您需要决定是否/如何将权限授予其他用户
  • 虽然您确实不能重用跟踪文件,但您可以为跟踪文件所在的目录创建一个代理表,然后从目录中‘删除’跟踪文件,例如:

create proxy_table tracedir external directory at '/tmp' go delete tracedir where filename = 'my_serverlmiits' go

  • 如果您可以同时运行代理表解决方案的多个副本,那么您显然会(?)需要确保为每个会话生成唯一的跟踪文件名称;虽然您可以通过将@@spid附加到文件名来做到这一点,但您也可以添加登录名(suser_name())、KPID (从master..monProcess where SPID =@@spid中选择kpid )等;在尝试创建文件之前,您还需要确保这样的文件不存在(例如,delete create filename = '.....';set tracefile...)
  • 您的错误(从代理表中选择时)似乎与在事务隔离级别0(默认情况下,需要表上的唯一索引... )下运行的客户端应用程序有关。而不是针对指向OS文件的代理表所做的事情);尝试将隔离级别设置为1,或者使用不默认为隔离级别0的客户端应用程序(例如,该示例使用基本的isql命令行工具运行得很好)
  • 如果要将此解决方案产品化,那么您可能希望分配一个单独的文件系统,以便任何“跑路”跟踪会话不会填满重要的文件系统(例如,/var、/tmp、$SYBASE等)
  • 也从生产/安全的角度来看。我可能想调查一下是否有可能将许多细节封装在DBA/系统进程中(创建该进程是为了在创建者的权限下执行),以确保开发人员不会在“错误”的目录中创建跟踪文件……在re上:控制/安全...

再一次..。

如果你要经常这样做的话...而且你只对(联合)查询中的最大表数感兴趣,那么构建一个静态的if/ then /else (或case)表达式来匹配你的ASE版本和几个可能的数字可能会容易得多(参见RobV的文章)。

让我们面对它,有多少次真的,真的,真的要构建一个超过100个表的查询,更不用说500个,1000个,更多了?你真的不想去尝试调整这样一个怪物!!老实说,我看不出有什么理由要使代理表解决方案产品化,只为了访问dbcc服务器限制中的一行,而您只需要实现一个硬限制(例如,最多100个表)。

我想得越多,作为一名DBA,我就会尽我所能确保您的应用程序不会因为开发人员想不出更有效的解决方案而创建一些怪异的、数百个表查询,最终导致我的数据服务器瘫痪。天哪,这种类型的应用程序不会被推广到普通用户社区,也就是说,我将不得不处理在我的数据服务器上运行的数十/数百个这种怪物的副本?!

票数 2
EN

Stack Overflow用户

发布于 2017-04-13 15:00:52

您可以通过运行'dbcc serverlimits‘获得这样的限制(首先启用traceflag 3604 )。

在15.7版本之前,最大值为256。在16.0中,这一数字提高到512。在16.0 SP01中,这个值再次提高到1023。

票数 1
EN

Stack Overflow用户

发布于 2017-04-12 21:03:35

我建议您打开一个案例/票证与SAP支持,以了解是否有任何系统表存储此信息。如果没有,我将实现您提到的繁琐的解决方案,并将监视ASE15.7日志中的以下错误:

代码语言:javascript
复制
CR 805525 -- If you exceed the number of tables in a UNION query you can get a signal 11 in ord_getrowbounds instead of an error message. 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43361888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档