TSQL存储过程动态处理各种参数,以每个参数执行存储过程

时间:2018-07-23 18:31:52

标签: sql-server tsql grafana

我正在使用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调用存储过程。

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

  1. 创建一个函数,该函数将基于特定的定界符来分割您的字符串(似乎在这种情况下,定界符将是逗号
  2. 使用该功能拆分服务器名称字符串

    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函数。