Como posso ver se esse patch foi aplicado ao meu servidor SQL Server?
Eu sei sobre @@version , mas isso me mostra o último patch aplicado, e os outros patches anteriores a esse?
Um dos desenvolvedores da minha empresa configurou um profiler SQL com um filtro no ID do banco de dados .
Ele está me dizendo que o ID do banco de dados que ele está procurando mudou.
O banco de dados em questão ainda está lá, mas em vez de 61 agora é 60.
aspas duplas são usadas no sql server e seu comportamento pode ser definido pela opção SET QUOTED_IDENTIFIER ON \ OFF
aspas duplas também são usadas no powershell .
SET QUOTED_IDENTIFIER deve estar ON quando você invocar métodos de tipo de dados XML.
esta é uma visão parcial de um procedimento armazenado que desejo implantar em vários servidores, no entanto, por causa do identificador entre aspas, ou aspas duplas, este caractere - " - não está funcionando no PowerShell, no código visual que uso para implantar.
DECLARE @WebXConfigurationID INT,
@stored_URL VARCHAR(2000), @cur_URL VARCHAR(2000),
@stored_OpsServiceURL VARCHAR(2000), @cur_OPSServiceURL VARCHAR(2000),
@cur_Properties XML;
PRINT 'WebX Configuration: ' + CAST(@WebXConfigurationID AS VARCHAR(20));
IF (ISNULL(@stored_URL, '') <> ISNULL(@cur_URL, ''))
BEGIN
PRINT ' - Base URL needs updating'
END
ELSE
BEGIN
PRINT ' - Base URL does not need updating'
END;
IF (ISNULL(@stored_OpsServiceURL, '') <> ISNULL(@cur_OPSServiceURL, '') AND @cur_OPSServiceURL IS NOT NULL)
BEGIN
PRINT ' - OPS Service URL needs updating'
SET @cur_Properties.modify('replace value of (/properties[1]//OPSServiceURL[1]/text())[1] with sql:variable("@stored_OpsServiceURL")')
END
ELSE
BEGIN
PRINT ' - OPS Service URL does not need updating'
END;
esta é a mensagem de erro:
"' in expression or statement.
At C:\sp_PosRestore.ps1:636 char:114
+ ... ServiceURL[1]/text())[1] with sql:variable("@stored_OpsServiceURL")')
+ ~~~~~~~~~~~~~~~~~~~~~
The splatting operator '@' cannot be used to reference variables in an expression. '@stored_OpsServiceURL' can be used only as an argument to a command. To reference variables in an expression use
'$stored_OpsServiceURL'.
+ CategoryInfo : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : UnexpectedToken
O código do Powershell:
$SQLQuery =
"
DECLARE @WebXConfigurationID INT,
@stored_URL VARCHAR(2000), @cur_URL VARCHAR(2000),
@stored_OpsServiceURL VARCHAR(2000), @cur_OPSServiceURL VARCHAR(2000),
@cur_Properties XML;
PRINT 'WebX Configuration: ' + CAST(@WebXConfigurationID AS VARCHAR(20));
IF (ISNULL(@stored_URL, '') <> ISNULL(@cur_URL, ''))
BEGIN
PRINT ' - Base URL needs updating'
END
ELSE
BEGIN
PRINT ' - Base URL does not need updating'
END;
IF (ISNULL(@stored_OpsServiceURL, '') <> ISNULL(@cur_OPSServiceURL, '') AND @cur_OPSServiceURL IS NOT NULL)
BEGIN
PRINT ' - OPS Service URL needs updating'
SET @cur_Properties.modify('replace value of (/properties[1]//OPSServiceURL[1]/text())[1] with sql:variable("@stored_OpsServiceURL")')
END
ELSE
BEGIN
PRINT ' - OPS Service URL does not need updating'
END;
"
Se você observar como alterar temporariamente as configurações do SQL Server para executar uma tarefa e, quando terminar, reverter, há uma maneira de salvar as configurações do SQL Server antes de habilitá-las, para que você possa desabilitá-las se necessário.
Aqui está o código (parcialmente copiado):
IF OBJECT_ID('tempdb.dbo.#Settings') IS NOT NULL
DROP TABLE #Settings;
CREATE TABLE #Settings
(
Setting VARCHAR(100),
Val INT
)
INSERT #Settings (Setting, Val)
SELECT 'show advanced options', cast(value_in_use as int) from sys.configurations where name = 'show advanced options'
UNION
SELECT 'xp_cmdshell', cast(value_in_use as int) from sys.configurations where name = 'xp_cmdshell'
UNION
SELECT 'Ad Hoc Distributed Queries', cast(value_in_use as int) from sys.configurations where name = 'Ad Hoc Distributed Queries'
SELECT * FROM #Settings;
Isso funciona bem se você executar um procedimento por vez; no entanto, ele grava no log de erros do SQL Server, como você pode ver abaixo:
Existe uma maneira de evitar gravar alterações de configurações no log de erros?
Trabalhando em um script para remover bancos de dados .
Em alguns ambientes, nossos bancos de dados são restaurados regularmente do ativo, a replicação (mesclagem ou transacional) é estabelecida, os processos são executados e testados e, então, os bancos de dados precisam ser descartados, pois todo o desenvolvimento foi implantado no ativo. Agora, outro ciclo começa.
como parte da automação da eliminação do banco de dados até agora, criei este script abaixo:
select
DROP_DB_SCRIPT='use master;' + char(13)
+ case when source_database_id is not null -- this is a database snapshot
then ''
else
' alter database ' + name + ' set single_user with rollback immediate ' + -- put db in single user mode
case when (sb.is_published = 1 or sb.is_merge_published = 1)
then 'EXEC sp_removedbreplication ' + '''' + name + '''' -- remove db from the replication
else ''
end +char(13)
end +char(13) +
' drop database ' + quotename(name) +char(13)
,*
from sys.databases sb
where database_id >= 5
and is_distributor= 0
O script acima não fará nada além de produzir um script que eu possa usar para excluir um banco de dados ou conjunto de bancos de dados desejado.
ele leva em consideração a replicação (você precisa remover a replicação separadamente) e se o banco de dados é um snapshot de banco de dados , o que é uma coisa diferente .
Não considerei o seguinte:
Um banco de dados OFFLINE deve ser DEFINIDO COMO EMERGÊNCIA antes de ser descartado?
a questão aqui é: há algo, alguma verificação, que você pode ver que eu deveria ter adicionado, mas não adicionei?
Eu lidei com duas coisas:
Eu não lidei com:
Recentemente encontrei online este artigo incrível sobre backups parciais de Alexandr Omelchenko
-- this is how he would do a backup:
BACKUP DATABASE your_database TO DISK = 'full.bak'
BACKUP DATABASE your_database READ_WRITE_FILEGROUPS TO DISK = 'partial_backup_full.bak'
BACKUP DATABASE your_database READ_WRITE_FILEGROUPS TO DISK = 'partial_backup_diff.bak' WITH DIFFERENTIAL
-- this is how he would do a restore:
RESTORE DATABASE your_database FROM DISK = 'full.bak' WITH NORECOVERY
GO
RESTORE DATABASE your_dataabse FROM DISK = 'partial_backup_full.bak' WITH NORECOVERY
GO
RESTORE DATABASE your_database FROM DISK = 'partial_backup_diff.bak' WITH RECOVERY
GO
Acontece que tenho alguns bancos de dados que têm 4 grupos de arquivos. Um desses grupos de arquivos é carregado com documentos que são salvos dentro de uma tabela naquele grupo de arquivos.
Acho que seria benéfico fazer backup dos grupos de arquivos separadamente.
Quais seriam as possíveis desvantagens em fazer isso? Além da sobrecarga de alterar o restore verifyonly , incluindo dbaTools , para acomodar essa mudança e garantir fazer backups com checksums ?
Algo que eu precisaria verificar é a compressão . Outra coisa é a opção checksum para os backups - como sugerido pelo próprio homem - Ola - aqui e Paul Randal aqui .
Definitivamente precisamos verificar se nossos backups são confiáveis .
Eu estava olhando para algumas `tabelas de trabalho' da consulta abaixo do meu amigo Martin
SELECT st.session_id
,at.*,
case transaction_type
when 1 then 'Read/Write'
when 2 then 'Read-Only'
when 3 then 'System'
when 4 then 'Distributed'
else 'Unknown - ' + convert(varchar(20), transaction_type)
end as tranType,
case transaction_state
when 0 then 'Uninitialized'
when 1 then 'Not Yet Started'
when 2 then 'Active'
when 3 then 'Ended (Read-Only)'
when 4 then 'Committing'
when 5 then 'Prepared'
when 6 then 'Committed'
when 7 then 'Rolling Back'
when 8 then 'Rolled Back'
else 'Unknown - ' + convert(varchar(20), transaction_state)
end as tranState,
case dtc_state
when 0 then NULL
when 1 then 'Active'
when 2 then 'Prepared'
when 3 then 'Committed'
when 4 then 'Aborted'
when 5 then 'Recovered'
else 'Unknown - ' + convert(varchar(20), dtc_state)
end as dtcState
FROM sys.dm_tran_active_transactions at
left JOIN sys.dm_tran_session_transactions st ON st.transaction_id = at.transaction_id
ORDER BY at.transaction_begin_time
uma coisa que me chamou a atenção é o fato de que essas transações não possuem uma sessão correspondente?
como posso descobrir de onde eles vêm?
Não há nenhuma sessão associada a eles.
Tenho um script para me mostrar os artigos de replicação de uma publicação:
declare @publication_name sysname = 'my_pub'
declare @database_name sysname = 'my_db'
use [my_db]
select ServerName = @@servername
,publication_name=p.name
,p.repl_freq
,p.status
,p.sync_method
--,snapshot_job_name=j.name
,p.independent_agent
,p.immediate_sync
,p.allow_anonymous
,p.replicate_ddl
,article_name=OBJECT_SCHEMA_NAME(a.objid) + '.' + OBJECT_NAME(a.objid)
,a.pre_creation_cmd
,pre_creation_cmd_desc = CASE a.pre_creation_cmd
WHEN 0 THEN 'none - Doesn''t use a command.'
WHEN 1 THEN 'drop - Drops the destination table.'
WHEN 2 THEN 'delete - Deletes the destination table.'
WHEN 3 THEN 'truncate - Truncates the destination table.'
ELSE 'Not known - Radhe Radhe'
END
FROM dbo.syspublications P
INNER JOIN dbo.sysarticles A
ON P.pubid = A.pubid
left outer JOIN msdb.dbo.sysjobs j
ON j.job_id = p.snapshot_jobid
where p.name = @publication_name
Entretanto, nesta publicação específica em que estou trabalhando no momento, também tenho funções e esses objetos não são mostrados na minha consulta acima?
Como posso vê-los, já que sei que estão lá?
Recebi esta ótima consulta que mostra o backup mais recente para cada banco de dados existente .
SELECT
M.name,
[Recovery Model] =
M.recovery_model_desc,
[State] =
M.state_desc,
[Last Full Backup] =
FORMAT(ISNULL(M.D, '19000101'), 'dd-MM-yyyy hh:mm'),
[Last Differential Backup] =
FORMAT(ISNULL(M.I, '19000101'), 'dd-MM-yyyy hh:mm'),
[Last log Backup] =
FORMAT(ISNULL(M.L, '19000101'), 'dd-MM-yyyy hh:mm')
FROM
(
SELECT
db.name,
db.state_desc,
db.recovery_model_desc,
a.type,
a.backup_finish_date
FROM master.sys.databases AS db
LEFT OUTER JOIN msdb.dbo.backupset AS a
ON a.database_name = db.name
) AS Sourcetable
PIVOT
(
MAX(backup_finish_date)
FOR type IN
(
D,
I,
L
)
) AS M --ostRecentBackup
WHERE name NOT IN
(
N'master',
N'msdb',
N'model',
N'tempdb'
);
Notei que ele usa pivotamento. E se eu tivesse que adicionar o local também? Seriam várias colunas .
Seja dinamizando usando múltiplas colunas ou desdinamizando , como eu poderia adicionar a localização de cada tipo de backup à consulta acima?
basicamente onde está o último backup completo, onde está o último diff e o último log (se houver).
este é o script que uso para ver a localização do backup:
SELECT
CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server,
msdb.dbo.backupset.database_name,
msdb.dbo.backupset.TYPE,
msdb.dbo.backupset.backup_start_date,
msdb.dbo.backupset.backup_finish_date,
msdb.dbo.backupset.expiration_date,
msdb.dbo.backupset.backup_size,
msdb.dbo.backupset.backup_size * 1.024 /1024/1024 as [Backup size in MB],
msdb.dbo.backupmediafamily.logical_device_name,
msdb.dbo.backupmediafamily.physical_device_name,
msdb.dbo.backupset.name AS backupset_name,
msdb.dbo.backupset.description
FROM msdb.dbo.backupmediafamily
INNER JOIN msdb.dbo.backupset
ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id
--WHERE msdb.dbo.backupset.database_name = 'PivCRM_Prod_Online_ED'
--AND TYPE = 'D' -- L D and I
ORDER BY msdb.dbo.backupset.backup_start_date DESC
a questão é:
como eu adicionaria o local do backup (cada tipo) à primeira consulta?
Estou procurando o local da pasta de instantâneos para minha replicação de mesclagem
Eu tentei:
select top 5 * FROM sysmergepublications pub
select * FROM dbo.sysmergeSubscriptions
mas isso não me mostra o nome da pasta e como precisa de permissões sobre ela
onde posso obter essas informações usando t-sql?
alteramos recentemente o servidor de arquivos que é o servidor do repositório (o local onde os backups são armazenados).
Notei que o hardware, especialmente o IO, é muito melhor e o backup demora menos para terminar, dependendo de muitos fatores. No entanto, as restaurações ainda demoram o mesmo tempo de antes.
esta não é uma pergunta complexa, tenho apenas uma pergunta aqui:
o que é physical_block_size
?
quando você executa a seguinte consulta no msdb
banco de dados:
SELECT *
FROM msdb.dbo.backupmediafamily BMF WITH(NOLOCK)
order by 1 desc
este é o resultado da consulta acima e observe como o physical_block_size
valor mudou de 4096 para 512 exatamente quando decidi usar nosso novo servidor mencionado acima para o destino dos backups:
usando a estratégia de backup do Ola , há um trabalho
databaseBackup - bancos de dados do sistema cheios, como você pode ver na figura abaixo.
esse trabalho está programado para ser executado uma vez por semana, no domingo de manhã.
está tudo bem, já está funcionando há algum tempo.
Agora preciso alterá-lo para funcionar todos os dias.
isso funciona bem usando ssms, criando scripts para a mudança e aplicando-a.
porém, como preciso fazer isso em dezenas de servidores, precisarei de um script que descubra qual é o agendamento, altere-o e reaplique-o no trabalho
Não consegui, mas me pergunto se alguém já fez isso.
Tenho trabalhado com mapeamento de unidades dentro do sql server .
Mapeei algo semelhante a isto:
EXEC XP_CMDSHELL 'net use y: "\\my_server\Initialed Folders\MM" @@__password__@@ /User:mycompany\m_miorelli /persistent:NO'
e isso foi há mais de 3 meses.
agora eu mudei minha senha.
então quando eu for para o mesmo servidor, vamos chamá-lo de my_server, e eu executo isso
EXEC XP_CMDSHELL 'net use'
Eu obtenho este resultado:
você vê que há az: drive ainda pendurado aí, não sei exatamente como, talvez eu tenha mapeado ...persisted
Quando tento qualquer operação que envolva o servidor onde residem os backups, recebo esta mensagem de erro:
restore filelistonly from disk=N'\\backup_server\ Initialed Folders\MM\backup_of_a_database.bak'
Msg 3201, Level 16, State 2, Line 20
Cannot open backup device '\\backup_server\ Initialed Folders\MM\backup_of_a_database.bak'. Operating system error 1326(The user name or password is incorrect.).
Msg 3013, Level 16, State 1, Line 20
RESTORE FILELIST is terminating abnormally.
Eu tentei fazer isso :
exec xp_cmdshell 'net use \\ip\xxx pass /user:xxx /persistent:no'
questões):
como posso me livrar dessa unidade mapeada? ou objetivo muito específico: como posso me livrar dessa coisa de senha errada?
isso não está acontecendo em nenhum outro servidor.
Seguindo o conselho de Craig nos comentários, obrigado Craig , removi minha unidade mapeada
EXEC XP_CMDSHELL 'NET USE Z: /d'
Isso me deixou feliz e agradecido, porém não resolveu o problema.
Este gatilho ações na criação do banco de dados - mostra um exemplo de um gatilho do lado do servidor que é acionado quando alguém cria um novo banco de dados.
Esta outra pergunta - Gatilho para alterar o agrupamento do banco de dados na criação - também mostra um exemplo de gatilho do lado do servidor que é acionado quando alguém cria um novo banco de dados.
Tenho aqui um exemplo de gatilho do lado do servidor que evita que os usuários descartem logins:
USE [master]
GO
--======================================================================
-- example of a server trigger - does not allow a login to be dropped
--======================================================================
create trigger [no_dropped_logins] on all server
for drop_login
as
insert into ##LOGIN_WATCH
select r.*, s.login_name, s.host_name,
EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') AS 'CmdText'
from sys.dm_exec_requests r
inner join sys.dm_exec_sessions s
on r.session_id = s.session_id
where r.session_id = @@SPID
Minha pergunta é:
como posso evitar a criação de um servidor vinculado no sql server usando gatilhos do lado do servidor?
ao tentar impedir que o crescimento automático aconteça, recebi este script legal aqui .
entretanto, se isso acontecer, preciso saber como descobrir. isso posso fazer usando este script muito bom de Max Vernon .
print @@servername + ' - ' + SUBSTRING(@@version,1,COALESCE(CHARINDEX('Copyright',@@version,0)-1,108))
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT OFF
/*
Description: display growth events for all databases on the instance
by: Max Vernon
date: 2014-10-01
*/
DECLARE @Version NVARCHAR(255);
DECLARE @VersionINT INT;
SET @Version = CONVERT(NVARCHAR(255),SERVERPROPERTY('ProductVersion'));
SET @VersionINT = CONVERT(INT, SUBSTRING(@Version,1 ,CHARINDEX('.',@Version)-1));
DECLARE @cmd NVARCHAR(2000);
SET @cmd = '';
IF @VersionINT >= 9
BEGIN
SET @cmd =
'
DECLARE @trcfilename VARCHAR(1000);
SELECT @trcfilename = path
FROM sys.traces WITH(NOLOCK)
WHERE is_default = 1;
IF COALESCE(@trcfilename,'''') <> ''''
BEGIN
SELECT [Radhe]=
'''''''' + @@SERVERNAME + '''''','''''' +
DB_NAME(mf.database_id) + '''''','''''' +
mf.name + '''''','' +
CONVERT(VARCHAR(255), a.NumberOfGrowths) + '','' +
CONVERT(VARCHAR(255), CAST(a.DurationOfGrowthsInSeconds AS decimal(38, 20)))
FROM
(
SELECT
tt.DatabaseID AS database_id,
tt.FileName AS LogicalFileName,
COUNT(*) AS NumberOfGrowths,
SUM(tt.Duration / (1000 * 1000.0)) AS DurationOfGrowthsInSeconds
FROM sys.fn_trace_gettable(@trcfilename, default) tt
WHERE (EventClass IN (92, 93))
GROUP BY
tt.DatabaseID,
tt.FileName
) a
INNER JOIN sys.master_files mf ON
(mf.database_id = a.database_id) AND
(mf.name = a.LogicalFileName);
END
ELSE
BEGIN
SELECT @@SERVERNAME, ''NO TRACE FILE'';
END
';
EXEC sp_executesql @cmd;
END
ELSE
BEGIN
SELECT [SERVER NAME]=@@SERVERNAME, [Product Version]=SERVERPROPERTY('ProductVersion');
END
o que está faltando e eu gostaria de acrescentar é: quando aconteceu o crescimento automático?
como posso descobrir isso?
quando executo o seguinte script:
-- ——— SCRIPT GRANTS for Object Privileges—————
IF OBJECT_ID('[sys].[sysrowsets]') IS NOT NULL GRANT CONTROL on [sys].[sysrowsets] to [db_myrole_BA]
Recebo esta mensagem de erro:
Msg 15151, Level 16, State 1, Line 271
Cannot find the object 'sysrowsets', because it does not exist or you do not have permission.
No entanto:
quando executo isso:
select radhe=OBJECT_ID('[sys].[sysrowsets]')
Meu script original vem daqui:
-- SCRIPT GRANTS for Objects Level Privilegs
PRINT '-- ——— SCRIPT GRANTS for Object Privileges—————'
SELECT
[GRANTS for Object Privileges]='IF OBJECT_ID(''['+ sys.schemas.name + '].[' + sys.objects.name + ']''' + ') IS NOT NULL ' + CHAR(13) + SPACE(1) +
state_desc + ' ' + permission_name + ' on ['+ sys.schemas.name + '].[' + sys.objects.name + '] to [' + sys.database_principals.name + ']' COLLATE SQL_Latin1_General_CP1_CI_AS
from sys.database_permissions
join sys.objects on sys.database_permissions.major_id =
sys.objects.object_id
join sys.schemas on sys.objects.schema_id = sys.schemas.schema_id
join sys.database_principals on sys.database_permissions.grantee_principal_id =
sys.database_principals.principal_id
where sys.database_principals.name not in ( 'public', 'guest')
--order by 1, 2, 3, 5
Como é possível que eu esteja recebendo esse erro?
Quero salvar todas essas permissões, para que, quando restaurar o banco de dados, possa reaplicar essas permissões.
hoje tive que verificar se a criptografia em trânsito estava instalada e funcionando em um determinado servidor (sql server) e se não, configurá-la.
a maneira como isso é feito é:
No SQL Server Configuration Manager, expanda Configuração de rede do SQL Server, clique com o botão direito em Protocolos para e selecione Propriedades. Na guia Sinalizadores, na caixa ForceEncryption, selecione Sim e selecione OK para fechar a caixa de diálogo. Reinicie o serviço SQL Server.
a imagem abaixo é depois de reiniciar o serviço do sql server .
agora, sou um DBA que gosta do paraíso do DBA e de toda automação e coisas feitas por meio de scripts.
Como eu poderia fazer isso por meio de scripts? soluções parciais também são válidas. e pode ser PowerShell, T-SQL ou qualquer outra linguagem de script.
Eu tenho uma consulta que me mostra todas as instâncias do SQL Server em um servidor:
DECLARE @GetInstances TABLE
( Value nvarchar(100),
InstanceNames nvarchar(100),
Data nvarchar(100))
Insert into @GetInstances
EXECUTE xp_regread
@rootkey = 'HKEY_LOCAL_MACHINE',
@key = 'SOFTWARE\Microsoft\Microsoft SQL Server',
@value_name = 'InstalledInstances'
Select [ServerName] = @@servername,InstanceNames from @GetInstances
e também tenho uma consulta que mostra as configurações de memória e o uso de uma instância específica:
SELECT [instance] = @@servername, p.*
FROM (SELECT name, [value_in_use]
FROM sys.configurations) t
PIVOT (MAX([value_in_use]) FOR name IN ([min server memory (MB)],
[min memory per query (KB)],
[max server memory (MB)],
[optimize for ad hoc workloads])) p
existe uma maneira de ter o melhor desses dois mundos - ter todas as informações de todas as minhas instâncias do SQL Server, em uma consulta?
Gostaria de evitar a necessidade de criar um servidor vinculado.
Eu não me importaria de usar o PowerShell ou qualquer outra ferramenta, desde que não precise executá-lo como administrador.
Estou tentando converter mensagens de trabalhos msdb para xml .
Estou usando rotinas de backup de Ola Hallengren .
quando executo a rotina a seguir, ela funciona de maneira incrível e converte tudo.
agora, se eu mudar o número 3333 para 3702 ele falha.
Não consigo identificar o que vem depois do caractere 3701 na mensagem, mas isso está me impedindo de converter a mensagem completa para xml
Se você usa o Ola, pode testar em seu próprio sistema. deixe-me saber se você descobrir como alterar minha função para que eu possa converter nvarchar(max) ou varchar(max) em xml com sucesso .
create or alter FUNCTION dbo.fnCleanString (@InputString VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @CleanedString VARCHAR(MAX) = '';
DECLARE @Char VARCHAR(1);
DECLARE @Index INT = 1;
DECLARE @Len INT = 3333-- LEN(@InputString);
WHILE @Index <= @Len
BEGIN
SET @Char = SUBSTRING(@InputString, @Index, 1);
IF (ASCII(@Char) NOT BETWEEN 0 AND 31 OR ASCII(@Char) IN (9, 10, 13))
BEGIN
SET @CleanedString += @Char;
END
SET @Index += 1;
END
RETURN @CleanedString;
END
go
SELECT TOP 50
SysJobs.name,
SysJobs.enabled,
Job.message AS Message_Text,
TRY_CAST(
(SELECT dbo.fnCleanString(Job.message) AS [text()]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') AS XML
) AS Message_XML
FROM msdb.dbo.sysjobhistory Job WITH (NOLOCK)
INNER JOIN msdb.dbo.sysjobs SysJobs WITH (NOLOCK)
ON Job.job_id = SysJobs.job_id
WHERE SysJobs.name = 'DatabaseBackup - USER_DATABASES - FULL'
ORDER BY Job.instance_id DESC;