1

我有数千个 *.sql 文件,它们都包含不同格式的 T-SQL 文本,我想匹配这些文件中的所有模式名称和对象名称。

我已经分离了以下可能的模式名称 + 对象名称格式

  • dbo.[MainPart.SubPartA.SubPartB.SubPartC]
  • [dbo].[MainPart.SubPartA.SubPartB.SubPartC]
  • specialschema.[MainPart.SubPartA.SubPartB.SubPartC]
  • specialschema.MainPart
  • [MainPart.SubPartA.SubPartB.SubPartC]

我已经创建了一个正则表达式来匹配前四种情况

    (\[{0,1}(?<schema>\b\w*?\b){0,1}\]{0,1}\.){0,1}\[{0,1}(?<object>(\w|\.)+)\]{0,1}

它将为每场比赛创建两组“模式”和“对象”。

问题是最后一种情况表明 schema=" MainPart " 和 object=" SubPartA.SubPartB.SubPartC "

此时我正在考虑将正则表达式分成几个部分以使其更简单(并且更具可读性),因为我已经有了匹配项,只有组不正确。

或者是否有另一种正则表达式技术可以为所有五个案例获取正确的组(并且仍然保持甚至提高可读性)?

SQL 文件的示例:

/******************************************************************
 Comment block
******************************************************************/ 

CREATE PROCEDURE [MainPart.SubPartA.SubPartB.SubPartC]
    @Param  INT = NULL
AS
BEGIN

    SET NOCOUNT ON

    SELECT * FROM dbo.[Table] WHERE fldParam = @Param

    SET NOCOUNT OFF

END
GO
4

1 回答 1

1

为什么不只是:

SELECT [schema] = OBJECT_SCHEMA_NAME(OBJECT_ID('dbo.[whatever.bob]')),
       [object] = OBJECT_NAME(OBJECT_ID('dbo.[whatever.bob]'));

或者如果对象还不存在:

SELECT [schema] = PARSENAME('dbo.[whatever.bob]', 2),
       [object] = PARSENAME('dbo.[whatever.bob]', 1);

如果缺少架构部分,您将需要使用合并:

SELECT [schema] = COALESCE(PARSENAME('[whatever.bob]', 2), 'dbo'),
       [object] = PARSENAME('[whatever.bob]', 1);

你有没有这种情况发生?似乎在您在问题中显示的 5 个值上工作正常。

于 2012-07-05T14:25:47.020 回答