J'ai écrit une requête qui récupère les informations de santé SQL AlwaysON. La seule chose à faire est d'ajouter une clause where à la fin pour filtrer AvailabilityGroupName et DatabaseName. Cela fonctionne quand je mets dans la requête: 'select * from results où AvailabilityGroupName =' LAB-VIP-USADB 'AND DatabaseName =' CPS ''. Cependant, lorsque je stocke la requête dans une variable nvarchar @sql au début et que j'exécute ensuite la requête stockée dans la variable, j'ai reçu le message d'erreur "Syntaxe incorrecte près du mot clé 'EXEC'". La raison pour laquelle je veux paramétrer la requête est qu'un groupe de disponibilité peut contenir plusieurs bases de données. L'entrée paramétrée proviendra de PRTG afin qu'elle interroge le groupe Disponibilité pour cette base de données spécifique.SQL dynamique, paramétré Requête
DECLARE @sql NVARCHAR(MAX)
SET @sql='SELECT * FROM Results WHERE AvailabilityGroupName = ''LAB-VIP-USADB'' AND DatabaseName = ''CPS'''
--select @sql
;
WITH basicaginfo AS(
SELECT
ag.name AS AvailabilityGroupName,
cs.replica_server_name AS NodeName,
rs.role_desc,
rs.synchronization_health_desc,
DB_NAME(drs.database_id) AS DatabaseName
FROM
sys.availability_groups ag
JOIN
sys.dm_hadr_availability_replica_cluster_states cs on ag.group_id = cs.group_id
JOIN
sys.dm_hadr_availability_replica_states rs ON (ag.group_id=rs.group_id AND cs.replica_id = rs.replica_id)
JOIN
sys.dm_hadr_database_replica_states drs ON (ag.group_id=drs.group_id AND cs.replica_id = drs.replica_id)
\t \t \t \t \t),
AG_Stats AS
(
SELECT AR.replica_server_name,
HARS.role_desc,
Db_name(DRS.database_id) [DBName],
DRS.last_commit_time
FROM sys.dm_hadr_database_replica_states DRS
INNER JOIN sys.availability_replicas AR ON DRS.replica_id = AR.replica_id
INNER JOIN sys.dm_hadr_availability_replica_states HARS ON AR.group_id = HARS.group_id
AND AR.replica_id = HARS.replica_id
),
Pri_CommitTime AS
(
SELECT replica_server_name
, DBName
, last_commit_time
FROM AG_Stats
WHERE role_desc = 'PRIMARY'
),
Sec_CommitTime AS
(
SELECT replica_server_name
, DBName
, last_commit_time
FROM AG_Stats
WHERE role_desc = 'SECONDARY'
),
\t \t Results AS
\t \t \t \t \t (
\t \t \t \t \t SELECT
\t \t \t \t \t \t AvailabilityGroupName,
\t \t \t \t \t \t DatabaseName,
\t \t \t \t \t \t [LAB-SCB-SQL01],
\t \t \t \t \t \t [LAB-SCB-SQL02],
\t \t \t \t \t \t [LAB-LAS-SQL01],
\t \t \t \t \t \t [LAB-LAS-SQL02],
\t \t \t \t \t \t [Max_Sync_Lag_Secs]
\t \t \t \t \t FROM(
\t \t \t \t \t \t \t SELECT
\t \t \t \t \t \t \t \t bb.AvailabilityGroupName,
\t \t \t \t \t \t \t \t bb.DatabaseName,
\t \t \t \t \t \t \t \t bb.NodeName,
\t \t \t \t \t \t \t \t bb.synchronization_health_desc,
\t \t \t \t \t \t \t \t MAX(DATEDIFF(ss,s.last_commit_time,p.last_commit_time)) OVER (PARTITION BY NULL) AS [Max_Sync_Lag_Secs]
\t \t \t \t \t \t \t FROM
\t \t \t \t \t \t \t \t basicaginfo bb
\t \t \t \t \t \t \t \t \t LEFT JOIN
\t \t \t \t \t \t \t \t Pri_CommitTime p ON p.DBName=bb.DatabaseName
\t \t \t \t \t \t \t \t \t LEFT JOIN
\t \t \t \t \t \t \t \t Sec_CommitTime s ON bb.NodeName = s.replica_server_name
\t \t \t \t \t \t) AS Data
\t \t \t \t \t PIVOT(
\t \t \t \t \t \t \t MAX(synchronization_health_desc) FOR [NodeName] IN([LAB-SCB-SQL01], [LAB-SCB-SQL02], [LAB-LAS-SQL01], [LAB-LAS-SQL02])
\t \t \t \t \t \t ) AS PivotedData
\t \t \t \t \t)
EXEC(@sql)