2016-11-11 38 views
2

我的任務是創建一個SQL Server 2016視圖,該視圖將顯示當前數據庫名稱,這些數據名稱不符合以下三種命名約定中的任何一種。將字符串列與SQL Server視圖中的複雜字符串模式匹配

的三個有效的命名約定我一直在考慮

  • 'XXX_YYY_DEV'
  • 'XXX_YYY_DEV-nnn.nnn.nnn'
  • 'XXX_YYY_DEV,爲nnn.nnn.nnn.nnn'

其中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 

回答