首页 > 解决方案 > 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' 附近的语法不正确

标签: sql-servertsql

解决方案


您缺少IN此行的关键字:

CacheType ('+(SELECT * FROM dbo.SplitString(@CacheType,','))+')   ')

当你声明它时,你也不应该把你的 sql 字符串放在括号中。


推荐阅读