1

異なる形式の T-SQL テキストを含む数千の *.sql ファイルがあり、それらのファイルのすべてのスキーマ名とオブジェクト名を一致させたいと考えています。

スキーマ名 + オブジェクト名の次の可能な形式を分離しました

  • dbo.[メインパーツ.サブパーツA.サブパーツB.サブパーツC]
  • [dbo].[MainPart.SubPartA.SubPartB.SubPartC]
  • specialschema.[メインパート.サブパートA.サブパートB.サブパートC]
  • specialschema.MainPart
  • [メインパーツ.サブパーツA.サブパーツB.サブパーツC]

最初の 4 つのケースに一致する正規表現を既に作成しました

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

一致ごとに「スキーマ」と「オブジェクト」の 2 つのグループが作成されます。

問題は、最後のケースで schema=" MainPart " および object=" SubPartA.SubPartB.SubPartC "と記載されていることです。

現時点では、正規表現をいくつかの部分に分割して、より単純にする (そしてより読みやすくする) ことを検討しています。これは、既に一致があり、グループだけが正しくないためです。

または、5 つのケースすべてで正しいグループを取得するための別の正規表現手法はありますか (それでも、読みやすさを維持または改善します)?

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 に答える