去年圣诞节我很高兴,因为我们停止了对 SQL Server 2000 的支持。
我可以停止扭曲我的大脑并使用友好的分析功能。(相信我,谈到将存储过程从 SQL-Server 迁移到 Oracle 时,分析函数是您最好的朋友之一)。
后来我们发现我们忽略了一个小烦恼。
当客户用新机器更换旧机器时,默认情况下它们的兼容性级别是根据旧机器设置的,问题会推迟到以后出现。
哪个问题?尽管兼容级别为 80,分析函数仍可在 SQL Server 2005 中使用。
我不敢说 PIVOT 等其他新功能被禁止了。
现在是尝试摆脱 cmptlevel 80 的好时机,但是如何呢?
对我来说,它主要是扫描过程、视图、函数和触发器以寻找旧式外部连接,如“*=”和“=*”。
首先让我们从系统表中找到定义文本。最初它以小块的形式保存在syscomments
. Hhm 如何处理“*”和“=”被拆分为后续块的情况。
接下来不要浪费时间从 INFORMATION_SCHEMA.ROUTINES 中选择 ROUTINES它会将定义截断为 4000 个字符。
最后,这是查询有问题的对象的代码:
select o.name , o.type, datalength(definition) len, len(definition) len, definition from sys.sql_modules m
join sysobjects o on o.id = m.object_id
where (definition like '%*=%' or definition like '%=*%')
但是还有一个障碍。因为默认值是从默认值派生的,所以文本结果的默认宽度太小(我认为它是 256,但由于这是我在 SSMS 中更改为 8192 的第一件事,我不会打赌)。
无论如何,这有助于识别需要更深入检查的行。
也许 sp_help 会显示所有可能情况的完整定义。
也许是这样,我不确定,因为我厌倦了穿孔卡片头造成的问题。通常我使用 ADO 和 PowerShell,但客户机器上可能没有安装它们。
是否有任何 100% 防水的 T-SQL 脚本来完成显示或导出由某些条件找到的过程的完整定义的工作?
快速搜索 StackOverflow 会显示您使用sys.sql_modules或OBJECT_DEFINITION来搜索 SQL Server 2005+ 上的代码。您可以简单地恢复到 SQL Server 2005+但不运行以允许此操作。
那就是如果你想要万无一失的 T-SQL。如果您愿意,可以在 SQL Server 2000 中将 syscomments 行连接在一起。我个人不会。
或者,使用SQL Server 2008 升级顾问来找出大多数(可能是所有)可能的问题(例如让我感到困惑的模棱两可的 ORDER BY 子句)。
注意Red Gate SQL Search只支持 SQL Server 2005+