2016-11-11 10 views
2

私の開発環境で現在のデータベース名が表示されるSQL Server 2016ビューの作成には、次の3つの命名規則に準拠していません。SQL Serverビュー内の複雑な文字列パターンに対する文字列列の一致

私は

  • 'XXX_YYY_DEV'
  • 'XXX_YYY_DEV-nnn.nnn.nnn'
  • 'XXX_YYY_DEV-はnnn.nnn.nnn.nnn' を与えられてきた3つの有効な命名規則

XXXは少なくとも1文字の英数字の可変長文字列ですYYYは少なくとも1文字の英数字で、 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 

答えて

関連する問題