使用正则表达式从SQL中提取模式名称和对象名称

时间:2012-07-05 14:22:52

标签: .net sql-server regex vb.net tsql

我有几千个* .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

1 个答案:

答案 0 :(得分:0)

为什么不呢:

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);

如果缺少架构部分,则需要使用coalesce:

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

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