如何从XML数据形成where子句

时间:2016-01-08 15:11:19

标签: sql-server xml

查看商店程序只是为了知道我的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。有可能吗?

寻求帮助和建议。感谢

1 个答案:

答案 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)