Grafana查询中使用仪表盘变量声明SQL变量报错的求助
问题分析与解决
错误的直接原因是Grafana变量$PC未被正确引号包裹,导致SQL Server无法识别它为字符串字面量,进而使@pcFilter变量的声明失败(因为前面的DECLARE @PC语句语法错误,后续代码未执行)。
修正步骤
正确引用Grafana变量:
在SQL中给@PC赋值时,使用Grafana的${PC:sqlstring}格式,它会自动将变量值包裹为合法的SQL字符串(包含单引号,且转义内部的单引号)。验证动态参数传递:
确保sp_executesql的参数定义和传递正确,这部分你的代码已经是对的。
修正后的完整SQL代码
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) DECLARE @PC AS NVARCHAR(255) = ${PC:sqlstring}; -- 修正:使用sqlstring格式包裹变量 DECLARE @pcFilter AS NVARCHAR(255) = '%' + @PC + '%' SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(PC) FROM DATOS_GENERALES DG INNER JOIN OPERACION_MANUAL OM ON DG.RefId = OM.RefId WHERE TimeStamp_UTC IS NOT NULL AND PC LIKE @pcFilter FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') SET @query = 'SELECT Fecha, ' + @cols + ' FROM (SELECT PC, CONVERT(NVARCHAR(8), TimeStamp_UTC, 112) AS Fecha, (TiempoTest + 2 * Tiempo)/3600 AS TiempoTotal FROM DATOS_GENERALES DG INNER JOIN OPERACION_MANUAL OM ON DG.RefId = OM.RefId WHERE TimeStamp_UTC IS NOT NULL AND PC LIKE @pcFilter) AS A PIVOT ( SUM(TiempoTotal) FOR PC IN (' + @cols + ') ) AS P ORDER BY Fecha DESC' EXECUTE sp_executesql @query, N'@pcFilter nvarchar(255)', @pcFilter = @pcFilter
额外说明(针对多值变量场景)
如果你的PC变量允许多选(Multi-value),上述代码仍无法正常工作,因为@PC只能存储单个值。此时需要修改逻辑:
- 使用Grafana的
${PC:csv}格式获取逗号分隔的字符串 - 将字符串拆分为表变量,再用
IN或EXISTS替代LIKE进行过滤
内容的提问来源于stack exchange,提问作者Jose Mari Muguruza
相关产品推荐
相关产品推荐

