Как отфильтровать год, используя символы маски или любой другой трюк в строке ниже? - PullRequest
1 голос
/ 17 марта 2020

У меня есть эта функция для удаления нежелательных символов:

USE MASTER
GO
CREATE FUNCTION [dbo].[fn_StripCharacters]
(
    @String NVARCHAR(MAX), 
    @MatchExpression VARCHAR(255)
)
RETURNS NVARCHAR(MAX)
WITH ENCRYPTION, SCHEMABINDING
AS
BEGIN
    SET @MatchExpression =  '%['+@MatchExpression+']%'

    WHILE PatIndex(@MatchExpression, @String) > 0
        SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '')

    RETURN @String

END

Я использую эту функцию в следующем сценарии, над которым я работаю, чтобы получить последний раз, когда машина была перезагружена:

Я также Заменить повторяющиеся пробелы одним пробелом в T- SQL, я не хочу повторяющихся пробелов в возвращаемой строке.

--=================================
-- script to get last time the machine rebooted
-- and what sql server and host OS do we have?
-- Marcello Miorelli 16-mar-2020
--=================================
IF OBJECT_ID('TEMPDB.DBO.#RADHE') IS NOT NULL
   DROP TABLE #RADHE

    --create the table
    CREATE TABLE #Radhe (logdate datetime not null default (getdate()), 
                         processinfo varchar(108) not null default ('Radhe'),
                         the_text varchar(4000))


    -- create a non-unique clustered index
    CREATE CLUSTERED INDEX IXC_RADHE_RADHE ON #RADHE(logdate desc, processinfo  asc)


    -- load the table
    INSERT #Radhe 
exec sp_readerrorlog 0,1,'Copyright (c)'

SELECT @@SERVERNAME as [Server Name]
      ,R.logdate AS [Last Time Server Rebooted]
      ,REPLACE(
               REPLACE(
                       REPLACE(
                               REPLACE(
                                master.dbo.fn_StripCharacters(R.the_text, 
                               '^a-z0-9()#@.<>^:^-^ '),
                               'Copyright (C) 2019 Microsoft Corporation','')
                               ,' ','<>')
                       ,'><','')
              ,'<>',' ')

FROM #RADHE R

это на моей текущей машине дает мне:

enter image description here

и это нормально. Тем не менее, когда я go проверяю какой-то другой аппарат, построенный в 2017 году, вместо 2019 года, я получаю следующее:

enter image description here

Вопрос:

Я хочу избавиться от следующего фрагмента сценария, независимого от года (2019):

Copyright (C) 2019 Microsoft Corporation

Какие маскируют символы можно ли использовать в этой ситуации?

Может быть, я смогу добиться этого с помощью patindex ? Я пытался:

Как убрать все не алфавитные c символов из строки в SQL Сервер?

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Вы можете использовать PATINDEX, чтобы найти, где в строке начинается шаблон Copyright (C) [0-9][0-9][0-9][0-9] Microsoft Corporation, а затем STUFF, чтобы удалить 40 символов после этой начальной точки.

DECLARE @text VARCHAR(MAX) = 'Microsoft SQL Server 2017 (RTM-CU17) (KB4515579) - 14.0.3238.1 (X64)    Sep 13 2019 15:49:57    Copyright (C) 2017 Microsoft Corporation   Developer Edition (64-bit) on Windows 10 Home 10.0 <X64> (Build 18362: )'


SELECT STUFF(@text,PATINDEX('%Copyright (C) [0-9][0-9][0-9][0-9] Microsoft Corporation%',@text),40,'')
0 голосов
/ 17 марта 2020

Да, я использовал PATINDEX, чтобы удалить 40 символов, как , предложенный Мартином Смитом , и теперь он работает как шарм:

--=================================
-- script to get last time the machine rebooted
-- and what sql server and host OS do we have?
-- Marcello Miorelli 16-mar-2020
--=================================
IF OBJECT_ID('TEMPDB.DBO.#RADHE') IS NOT NULL
   DROP TABLE #RADHE

    --create the table
    CREATE TABLE #Radhe (logdate datetime not null default (getdate()), 
                         processinfo varchar(108) not null default ('Radhe'),
                         the_text varchar(4000))


    -- create a non-unique clustered index
    CREATE CLUSTERED INDEX 
    IXC_RADHE_RADHE ON #RADHE(logdate desc, processinfo  asc)


    -- load the table
    INSERT #Radhe 
exec sp_readerrorlog 0,1,'Copyright (c)'

UPDATE #RADHE
SET the_text = master.dbo.fn_StripCharacters(the_text,'^a-z0-9()#@.<>^:^-^ ')

--select * from #radhe

 SELECT @@SERVERNAME as [Server Name]
       ,R.logdate AS [Last Time Server Rebooted]
       ,REPLACE(
                REPLACE(
                        REPLACE(
                                REPLACE(
                                 R.the_text,
                                SUBSTRING ( R.the_text,PATINDEX(
                                   '%Copyright (C)%',R.the_text),40),'')
                                ,' ','<>')
                        ,'><','')
               ,'<>',' ')

 FROM #RADHE R

сервер, построенный в 2017 году:

enter image description here

и этот 2019:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...