首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSQL-存储过程动态处理不同数量的参数以执行每个参数的存储过程。

问TSQL-存储过程动态处理不同数量的参数以执行每个参数的存储过程。
EN

Stack Overflow用户
提问于 2018-07-23 18:31:52
回答 1查看 181关注 0票数 1

我正在开发一个grafana仪表板,它允许选择一个或多个服务器和端口组合来返回每个server+port组合的数据。

代码语言:javascript
复制
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]”在单击不同组合so [ServerName]和[ServerPort]时动态变化。因此,实际的查询可以如下所示:

代码语言:javascript
复制
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调用存储过程。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-24 07:27:14

你可以这样做:

  1. 创建一个根据特定分隔符拆分字符串的函数(在本例中,分隔符应该是逗号)。
  2. 使用该函数拆分服务器名称字符串。 应激返回@res表(val (Max),set )作为begin @ += @分隔符;以cte为(选择cast(1作为bigint) f,charindex(@定界符,@参数) t,1个seq联合选择t+ 1,charindex(@定界符,@参数,t+ 1),seq +1从cte选择charindex(@定界符,@参数,t+ 1) > 0)插入@res select子字符串(@参数,f,t- f),seq从cte选项(res递归0) 返回端

然后,在您的GetGrafana过程中,不要在=中使用where子句,而是使用一个带有IN的子句,如下所示:

代码语言:javascript
复制
where ServerName IN dbo.split_str(ServerName, ',')

从Server 2016开始,您可以使用内置的裂开函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51485190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档