在 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.
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.