我正在使用grafana仪表板,该仪表板将允许选择一个或多个服务器和端口组合以按服务器和端口组合返回数据。
DECLARE
@StartDate DATETIME,
@EndDate DATETIME,
@ServerId SMALLINT,
SET @StartDate = DATEADD(HH,-1, @StartDate)
SET @EndDate = GETDATE()
SET @ServerId = (SELECT ServerId FROM dbo.Server
WHERE ServerName = [[ServerName]] AND ServerPort = [[ServerPort]])
EXECUTE GetGrafana @StartDate , @EndDate, @ServerId, 18 //Ignore the 18, not relevant to this question
在Grafana中,当我单击不同的组合(例如[[ServerName]]和[[ServerPort]]时,“ [[ServerName]]”和“ [[ServerPort]]”会动态变化。因此实际查询可能如下所示:
SET @ServerId = (SELECT ServerId FROM dbo.Server
WHERE ServerName = 's001','s002','s003' AND ServerPort = '1111','2222','3333','4444')
如果仅选择一个“ [[ServerName]]”和“ [[ServerPort]]”组合,则它可以执行存储过程。但是当我尝试放置多个组合时会出错,因为ServerId
不能有多个ServerName和ServerPort。我想知道如何配置查询以允许我处理ServerID中的多个“ [[ServerName]]”和“ [[ServerPort]]”并按ServerID
调用存储过程。
答案 0 :(得分:0)
您可以执行以下操作:
使用该功能拆分服务器名称字符串
create function [dbo].[split_str]
(
@parameter nvarchar(max),
@delimiter char(1)
)
returns @res table (val nvarchar(max), seq int)
as
begin
set @parameter += @delimiter
;with cte as
(
select cast(1 as bigint) f, charindex(@delimiter, @parameter) t, 1 seq
union all
select t + 1, charindex(@delimiter, @parameter, t + 1), seq + 1
from cte
where charindex(@delimiter, @parameter, t + 1) > 0
)
insert @res
select substring(@parameter, f, t - f), seq
from cte
option (maxrecursion 0)
返回 结束
然后,在您的GetGrafana
过程中,不要让带有where
的{{1}}子句,而是让带有=
的子句如下:
IN
从SQL Server 2016开始,您可以使用内置的STRING_SPLIT函数。