db2*_*db2 5 sql-server ssms t-sql enum
我们运行 Dynamics GP,任何处理过 GP 的人都会熟悉它的所有“幻数”列,这些列代表应用程序内的各种枚举值。例如,报告查询可能如下所示:
...
WHERE sod.SOPTYPE = 2
AND iv.VCTNMTHD = 3
AND pod.POLNESTA IN (2, 3)
Run Code Online (Sandbox Code Playgroud)
......这与自我记录尽可能远。
起初我有一个聪明的想法,即创建一个名为“Enums”的表,用值填充它,并制作一个标量包装函数,这样你就可以像这样查询:
...
WHERE sod.SOPTYPE = Enum('Sales Doc Type', 'Order')
AND iv.VCTNMTHD = Enum('Valuation Method', 'Average Perpetual')
AND pod.POLNESTA IN (Enum('PO Line State', 'Released'), Enum('PO Line State', 'Change Order'))
Run Code Online (Sandbox Code Playgroud)
当然,这很糟糕,因为优化器无法看到潜在的“常量”值,因此做出了一些相当糟糕的选择,因为它必须进行基数猜测。
所以它需要是代码中的实际常量值,但我不确定 SSMS 中是否有任何很好的功能可以使这种事情变得容易。我可以(错误地)以某种方式使用代码片段或模板吗?如果我们可以进行某种查找/插入来使我们的代码看起来像这样,那就太棒了:
...
WHERE sod.SOPTYPE = /*Order*/2
AND iv.VCTNMTHD = /*Average Perpetual*/3
AND pod.POLNESTA IN (/*Released*/2, /*Change Order*/3)
Run Code Online (Sandbox Code Playgroud)
我也不反对检查 SSMS 加载项。
小智 0
在 SSMS 中,您可以启用 SQLCMD 模式并执行以下操作:
-- Enable SQLCMD Mode (ALT+Q+M)
:SetVar cSomeNumber 42
SELECT $(cSomeNumber)
Run Code Online (Sandbox Code Playgroud)
如果将脚本保存到文件中,当您使用 with...等待... SQLCMD.exe 时,这些脚本的操作将相同
然而,“:SetVar”和“$(cSomeNumber)”是在sql 发送到引擎之前处理的。这意味着它不能在不同的客户端(例如 ADO.Net)中使用,并且如果您创建任何 DBO,它将记录解释的值。所以这:
-- Enable SQL Command Mode (ALT+Q+M)
:SetVar cSomeNumber 42
CREATE View Test AS SELECT $(cSomeNumber) as SomeNumber
Run Code Online (Sandbox Code Playgroud)
会产生这样的结果:
-- Enable SQL Command Mode (ALT+Q+M)
CREATE View [dbo].[Test] AS SELECT 42 as SomeNumber
Run Code Online (Sandbox Code Playgroud)
这限制了整体效用。