2016-11-11 14 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은 다른 nnn과 동일 할 수있는 가변 길이 숫자 값 (최소값 = '0')입니다.

예 :

데이터베이스 이름

  • '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 

답변