在 SQL 服务器存储过程中使用参数作为列

Use parameter as column in where in SQL Server stored procedure

BEGIN
    DECLARE @SQLQuery AS NVARCHAR(MAX)

    IF(@Search IS NOT NULL)
    BEGIN
        DECLARE @dyColumn sysname ;

        IF(@Filter = 'IsNew')
        BEGIN
            SET @dyColumn = 'IsNew'
        END
        ELSE IF(@Filter = 'IsOnSale')
        BEGIN
            SET @dyColumn = 'IsOnSale'
        END
        ELSE IF(@Filter = 'IsFeatured')
        BEGIN
            SET @dyColumn = 'IsFeatured'
        END

        SET @SQLQuery = 'SELECT P.*, C.Id AS CategoryId, C.Name AS CategoryName, C.Logo AS CategoryLogo,
                    CO.Id AS CompanyId, CO.Name AS CompanyName, CO.Logo AS CompanyLogo, COUNT(*) OVER() TotalCount
                    FROM Products P
                    JOIN Categories C ON  P.CategoryId = C.Id
                    JOIN Companies CO ON  P.CompanyId = CO.Id 
                    WHERE P.Name LIKE %'+@Search+'% AND '+@dyColumn+' = true
                    ORDER BY P.Name
                    OFFSET '+CAST(@PageSize AS nvarchar(100))+'*('+CAST(@PageNumber AS nvarchar(100)) +'- 1) ROWS
                    FETCH NEXT '+CAST(@PageSize AS nvarchar(100))+'ROWS ONLY OPTION (RECOMPILE);'

        EXECUTE(@SQLQuery)
    END

这是查询,它在 运行 时间

期间给出了这个错误

Incorrect syntax near '2'.
Invalid usage of the option NEXT in the FETCH statement.

这意味着在

之后查询出错
WHERE P.Name LIKE %'+@Search+'%

您不需要动态 sql 只需测试过滤器值与 WHERE 表达式中的列的值:

SELECT
    P.*
    ,C.Id AS CategoryId
    ,C.Name AS CategoryName
    ,C.Logo AS CategoryLogo
    ,CO.Id AS CompanyId
    ,CO.Name AS CompanyName
    ,CO.Logo AS CompanyLogo
    ,COUNT(*) OVER() TotalCount
FROM
    Products P
    JOIN Categories C
    ON  P.CategoryId = C.Id
    JOIN Companies CO
    ON  P.CompanyId = CO.Id 
WHERE
    @Search IS NOT NULL
    AND P.Name LIKE '%' + @Search + '%'
    AND ( 
       (@Filter= 'IsNew' AND IsNew = 1)
       OR (@Filter= 'IsOnSale' AND IsOnSale = 1)
       OR (@Filter= 'IsFeatured' AND IsFeatured = 1)
       OR (@Filter NOT IN ('IsNew','IsOnSale','IsFeatured'))
    )
ORDER BY
    P.Name
OFFSET  (@PageSize)*(@PageNumber)- 1 ROWS
FETCH NEXT (@PageSize) ROWS ONLY OPTION (RECOMPILE);

如果您真的想使用动态 SQL 而不是执行它 SELECT @SQLQuery 然后通过复制到另一个查询来查找语法问题 window.