2

次の 3 つの命名規則のいずれにも準拠していない開発環境の現在のデータベース名を表示する SQL Server 2016 ビューの作成を任されました。

私が与えられた 3 つの有効な命名規則

  • 「XXX_YYY_DEV」
  • 「XXX_YYY_DEV-nnn.nnn.nnn」
  • 「XXX_YYY_DEV-nnn.nnn.nnn.nnn」

ここXXXで、 は少なくとも 1 文字の英数字の長さの可変長文字列、 は少なくとも 1 文字の英数字YYYの長さの別の可変長文字列であり、 の各オカレンスはnnn可変長の数値 (最小値 = '0') であり、次のいずれかと同じになる可能性があります。他の nnn の。

例:

データベース名

  • 「Dinky_cu5tomer_DEV」
  • 「5aussage_Orders_DEV-12.3.0」
  • 「TExt1_text2_DEV-999.57.1​​.57」

規格に準拠しているため、ビューから除外されます。

データベース名

  • '_cu5tomer_DV'
  • 「5aussage_Orders_Now_DEV-12.3.0」
  • 「TExt1_text2_DEV-999.99a.1.57」

標準に準拠していないため、ビューから含める必要があります。

コンポーネント部分を分離しようとしましたが、数値部分が本当に困惑しています。

これは、数値ビットをコメントアウトして得た限りです。

CREATE View vw_NonStandardDatabaseNames 
AS
    SELECT DISTINCT 
        X.DBRealName AS 'Non-Standard Name',*
    FROM 
        (SELECT 
             db.name AS [DBRealName],

             -- Client
             (CASE 
                 WHEN PATINDEX ('%[_]%', db.name) > 1 
                    THEN SUBSTRING(db.name,1,PATINDEX ('%[_]%', db.name)-1)
                    ELSE ''
              END) AS [Client],

             -- First Underscore
             PATINDEX ('%[_]%', db.name) AS [Pos_1], 
             (CASE 
                 WHEN PATINDEX ('%[_]%', db.name) > 0 
                    THEN '_'
                    ELSE ''
              END) AS [US_1],
             (CASE 
                 WHEN PATINDEX ('%[_]DEV%', db.name) > 0 
                    THEN '_'
                    ELSE ''
              END) AS [US_2], 

             -- Database Name
             (CASE 
                 WHEN PATINDEX ('%[_]%', db.name) <= 1 
                    THEN '' -- No Underscore 1
                 WHEN PATINDEX ('%[_]DEV%', db.name) <= 3  
                    THEN '' -- No Client
                 WHEN PATINDEX ('%[_]%', db.name) = PATINDEX  ('%[_]DEV%', db.name) 
                    THEN '' -- No first underscore only second one + System Name.
                 WHEN PATINDEX ('%[_]%', db.name)+1 = PATINDEX ('%[_]DEV%', db.name) 
                    THEN '' -- First underscore but no DB Name then second underscore + System Name.
                 WHEN PATINDEX ('%[_]%', db.name) > 1 
                      AND PATINDEX ('%[_]DEV%', db.name) > 3 
                    THEN SUBSTRING(db.name, PATINDEX ('%[_]%', db.name)+1,(PATINDEX('%[_]DEV%', db.name)-(PATINDEX ('%[_]%', db.name)+1)))
                    ELSE ''
              END) AS [DBName],

           -- Second Underscore
           PATINDEX ('%[_]DEV%', db.name) AS [Pos2], 

           -- System Name
           (CASE
              WHEN PATINDEX ('%[_]DEV%', db.name) > 0 THEN 'DEV'
              ELSE ''
            END)  AS [System_Name],

           -- System Name
           (CASE
              WHEN PATINDEX ('%[_]DEV-%', db.name) > 0 THEN PATINDEX ('%[_]DEV-%', db.name) + 4
              ELSE 0
            END)  AS [POS_3] 

            ---- Hyphen after 'DEV' System Name
         --  (CASE 
            --  WHEN db.name LIKE '%[_]DEV-%' THEN '-' 
            --  ELSE ''
            --END) AS [Hyphen]

           ---- Version Major
           --'' AS [VersionMajor],

           --'' AS [Dot1],

           ---- Version Minor
           --'' AS [VersionMinor],

           --'' AS [Dot2],

           ---- Revision 
           --'' AS [Revision],

           --'' AS [Dot3],

           ---- Build
           --'' AS [Build]

      FROM sys.databases db
      WHERE db.name NOT IN ('master','model','msdb','tempdb')
  --UNION 
        --as above but with 3 digit Version
      --UNION 
        --as above but with 4 digit version

 )  X
WHERE 
    X.DBRealName != Concat(X.Client, X.US_1, X.DBName, X.US_2, X.System_Name)    --, X.Hyphen, X.VersionMajor, X.Dot1, X.VersionMinor, X.Dot2, X.Revision, X.Dot3, X.Build
4

1 に答える 1

0

CLR 正規表現関数をインストールすると、PATINDEX で得られる限定的な正規表現ではなく、適切な正規表現を使用できますか?

https://blogs.msdn.microsoft.com/sqlclr/2005/06/29/working-with-regular-expressions/

于 2016-11-11T20:33:12.060 に答える