Rob*_*gie 5 schema sql-server procedure-definition
我想通过检索和比较来自 sys.sql_modules 的定义来比较在几个不同数据库中应该相同的存储过程。
目前我正在考虑“相同”的程序,除了一个或其他副本在开始或结束时有空行或其他空格。这些似乎是通过制作程序脚本来添加的。我想删除空行等并比较剩下的内容。所以我可以这样做:
IF ( LEFT(@definition1, 2) = NCHAR(13) + NCHAR(10) )
SET @definition1 = SUBSTRING(@definition1, 3, 1048576)
Run Code Online (Sandbox Code Playgroud)
如果过程的长度小于 1048576 字节,这将起作用。但是长度的实际限制是多少——如果有的话?
我想实际上我应该问:比较程序的好方法是什么?(除了“从 Red Gate 购买 SQL 比较实用程序”。)
(修订)我刚刚意识到 sys.sql_modules.definition 具有数据类型 nvarchar(max) 并且具有指定的长度......以字节为单位,POWER(2, 31)-1,除了该公式不起作用;- ) 在 nchar 字符中,不超过 POWER(2, 30)-1。
所以这应该这样做:
IF ( LEFT(@definition1, 2) = NCHAR(13) + NCHAR(10) )
SET @definition1 = SUBSTRING(@definition1, 3, 2147483647)
Run Code Online (Sandbox Code Playgroud)
是的,那是 2^31-1,它应该是 2^30-1,但只要它大于 @definition1 是或可以是,我就可以逃脱。直到他们将“max”增加到 2^63-1 字节。在有“最大”之前,我使用了 8000。
也许我应该包括仔细检查 DATALENGTH() 以防它意外地被截断到某处的前 8000 个字节。
至于你关于良好的代码管理首先不需要这种需求的明智之言 - 有用的弹药,谢谢你(现在从我自己的隐藏中提取子弹)。我认识到有条不紊的工作实践的价值,即使它们也适用于我。但问题在于管理层,假设他们只是想要一份报告或结果 - 现在 - 并且多年来一直在获得和期待这样的服务 - 现在他们已经学会称之为“敏捷”。
这个问题存在于两个层面:
两个数据库之间的比较:
在这种情况下,您无需担心长度(除了可能DATALENGTH
用作存在差异的快速指示器,因此无需比较实际字符串值)。在这里,您只需要确保定义相同,并且不需要SUBSTRING
,但它确实需要添加COLLATE Latin1_General_100_BIN2
到比较中以确保您捕捉大小写等差异,否则评估为相等(使用对所有内容敏感的排序规则,例如以 结尾的任何内容_CS_AS_WS_KS[_SC]
,当通过组合字符和/或语言规则确定相等性时,无法发现差异)。
在特定环境中,对象在部署到的所有数据库中应该是相同的。由于没有任何定义与实际来源进行比较,因此脚本不会有任何差异。
尽管在此级别上进行比较更容易(因为您不必担心空格差异),但如果所有定义都相同,但它们都以完全相同的方式与源定义不同,则它们也可能会产生误导。
比较数据库和源脚本
在这种情况下,您确实需要担心长度和空格的变化,这取决于源对象脚本的编写方式以及它们如何打包以进行部署。在这里,T-SQL 不会帮助您,因为可能不同但仍然“相同”的内容有太多变化。
这是几个第 3 方工具发挥作用的地方,您应该选择其中之一。它们可以配置为忽略某些空白以及包含其他属性,有时甚至是权限。
如果您想知道生产中是否存在应该删除或考虑到源定义中的差异,您只能通过与源对象脚本进行比较来确定。
如果您没有每个对象的源脚本,那么您绝对需要这样做,现在是开始的好时机。
如果您没有某种版本控制(Git、SVN、TFS 等)的源脚本,那么您绝对需要这样做,现在是开始的好时机。
在相关说明中,最大大小(以字节为单位,而不是“字符”)的等式是正确的:
SELECT POWER(CONVERT(BIGINT, 2), 31) - 1
-- 2147483647
Run Code Online (Sandbox Code Playgroud)
该值的最大尺寸相匹配INT
的注意这里。由于NVARCHAR
是 UTF-16,即每个代码点 2 或 4 个字节(“字符”由 1 个或多个代码点组成,例如使用组合字符时),因此字符串的最大“长度”是一半假设所有“字符”都是单一的 2 字节种类(它们通常是)。意义:
SELECT 2147483647 / 2
-- 1073741823
Run Code Online (Sandbox Code Playgroud)
因此,一NVARCHAR(MAX)
列中“字符”的最大数量为 1,073,741,823。
但是,这无关紧要,SUBSTRING
因为如果请求返回比输入字符串中的字符多的字符,它在 T-SQL 中不会出错。例如:
SELECT SUBSTRING('A', 1, 100);
-- A
Run Code Online (Sandbox Code Playgroud)
因此,您可以将任意高值作为第三个参数。
归档时间: |
|
查看次数: |
2071 次 |
最近记录: |