sql-server - TSQL-使用函数调用动态查询时出错
问题描述
我有一个可以运行的查询 -
SELECT connected_clients, (ServerName + CacheType) AS metric, CreateDate AS time
FROM dbo.DiagnosticLog dl
WHERE ServerName IN ('001 ', '002 ', '003 ')
AND CacheType IN ('p.1 ', 'q.1 ', 'm.1 ', 'a-p.1 ', 'a-q.1 ', 'sentinel ')
connected_clients
是列名,所以我需要进行动态查询,并且我还需要调用一个函数,该函数将在 ServerName 和 CacheType 中用逗号分隔单词。这是我包含动态查询的存储过程:
@StartDate DATETIME,
@EndDate DATETIME,
@Message VARCHAR(MAX),
@ServerName CHAR(150),
@CacheType CHAR(150)
)
AS
BEGIN
DECLARE @sql NVARCHAR(MAX)
SET @sql =
('SELECT '+ @Message +', (ServerName + CacheType )as metric, CreateDate as time
FROM DiagnosticLog
WHERE ServerName in ('+(SELECT * FROM dbo.SplitString(@ServerName,','))+') AND
CacheType in ('+(SELECT * FROM dbo.SplitString(@CacheType,','))+') ')
EXECUTE (@sql)
END
GO
这就是我调用存储过程的方式
DECLARE
@StartDate DATETIME,
@EndDate DATETIME,
@Message CHAR(20)
SET @StartDate = DATEADD(HH,-24, GETDATE())
SET @EndDate = GETDATE()
EXECUTE storedProcedureName @StartDate, @EndDate , 'connected_clients', '001 ,002 ,003 ' , 'p.1 ,q.1 ,m.1 ,a-p.1 ,a-q.1 ,sentinel '
我得到的错误是:
子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的
编辑:我将sql
字符串更改为
@sql =
'SELECT '+ @Message +', (ServerName + CacheType )as metric, CreateDate as time
FROM DiagnosticLog dl
WHERE ServerName in (SELECT * FROM dbo.SplitString(' +@ServerName + ','','')) AND
CacheType in (SELECT * FROM dbo.SplitString(' +@CacheType+ ','','')) '
execute (@sql)
我得到一个错误
'.1' 附近的语法不正确
解决方案
您缺少IN
此行的关键字:
CacheType ('+(SELECT * FROM dbo.SplitString(@CacheType,','))+') ')
当你声明它时,你也不应该把你的 sql 字符串放在括号中。
推荐阅读
- arrays - F# 改变字符串中的一个字母
- java - 在不继承 Activity 和覆盖 onRequestPermissionsResult 方法的情况下处理权限请求结果
- powerbi - 在 Power BI 中按类别选择前三个价格点
- c# - 条纹支付到银行账户
- python - Python unittest找不到属性
- mysql - 加载数据并忽略制表符
- html - 通用选择器 * 仅适用于具有类的 p
- sql - 如何从今天的数据中选择最近 7 天?
- python - 当我尝试将 pandas 数据帧的一行的索引作为整数获取时,错误“只能将大小为 1 的数组转换为 Python 标量”
- vhdl - 为什么此信号不将状态传送到 VHDL 中的其他进程?