查看商店程序只是为了知道我的where子句是什么样子
CREATE PROCEDURE USP_GETData
(
@ProductID INT = NULL,
@ProductName NVARCHAR(50) = NULL
)
AS
BEGIN
DECLARE
@lProductID INT,
@lProductName NVARCHAR(50),
SET @lProductID = @ProductID
SET @lProductName = LTRIM(RTRIM(@ProductName))
; WITH CTE_Results
AS (
SELECT ROW_NUMBER() OVER (ORDER BY
CASE WHEN (@lSortCol = 'ProductID' AND @SortOrder='ASC')
THEN ProductID
END ASC,
CASE WHEN (@lSortCol = 'ProductID' AND @SortOrder='DESC')
THEN ProductID
END DESC,
CASE WHEN (@lSortCol = 'ProductName' AND @SortOrder='ASC')
THEN ProductName
END ASC,
CASE WHEN @lSortCol = 'ProductName' AND @SortOrder='DESC'
THEN ProductName
END DESC
) AS ROWNUM,
Count(*) over () AS TotalCount,
ProductID,
ProductName
FROM Products
WHERE
(@lProductID IS NULL OR ProductID = @lProductID)
AND (@lProductName IS NULL OR ProductName LIKE '%' + @lProductName + '%')
)
SELECT
ProductID,
ProductName
FROM CTE_Results AS CPC
我只想知道没有下面的where子句的硬编码
WHERE
(@lProductID IS NULL OR ProductID = @lProductID)
AND (@lProductName IS NULL OR ProductName LIKE '%' + @lProductName + '%')
我可以从XML数据中构建它吗?假设我的XML看起来像
DECLARE @xmlvar xml
SET @xmlvar='
<?xml version = "1.0" encoding="UTF-8" standalone="yes"?>
<Filters>
<param>
<SearchField>ProductID</SearchField>
<FilterCondition>=</FilterCondition>
<ConditionData>101</ConditionData>
</param>
<param>
<SearchField>ProductName</SearchField>
<FilterCondition>%</FilterCondition>
<ConditionData>Foo</ConditionData>
</param>
</Filters>'
所以我想解析xml并构建where子句而不使用动态sql。有可能吗?
寻求帮助和建议。感谢答案 0 :(得分:2)
我认为你需要像这样使用动态查询 -
DECLARE @WhereCond VARCHAR(MAX) = '', @Query VARCHAR(MAX)
DECLARE @xmlvar xml
SET @xmlvar='<?xml version = "1.0" encoding="UTF-8" standalone="yes"?>
<Filters>
<param>
<SearchField>ProductID</SearchField>
<FilterCondition>=</FilterCondition>
<ConditionData>101</ConditionData>
</param>
<param>
<SearchField>ProductName</SearchField>
<FilterCondition>%</FilterCondition>
<ConditionData>Foo</ConditionData>
</param>
</Filters>'
SELECT @WhereCond += ' AND ' + SearchField + REPLACE(FilterCondition, '%', 'LIKE ''%') + ConditionData + CASE WHEN FilterCondition = '%' THEN '%''' ELSE '' END FROM
(
select T.N.value('SearchField[1]', 'varchar(50)') AS SearchField, T.N.value('FilterCondition[1]', 'varchar(50)') AS FilterCondition, T.N.value('ConditionData[1]', 'varchar(50)') AS ConditionData
from @xmlvar.nodes('/Filters/param') as T(N)
) res
-- PRINT @WhereCond ---> AND ProductID=101 AND ProductNameLIKE '%Foo%'
SET @Query = N'
SELECT
Count(*) over () AS TotalCount,
ProductID,
ProductName
FROM Products
WHERE 1 = 1' + @WhereCond
EXEC (@Query)