SQL 动态参数化 where 字段和值

SQL dynamic parameterized where field and value

我有一个带过滤器的存储过程。

SELECT * FROM OrderBatch WHERE <field> LIKE '%pattern%';

但是,我希望 where 子句是动态的。理想情况下它看起来像:

CREATE PROCEDURE [dbo].[spGetOrderBatchesFiltered]
    @filterField VARCHAR(50) = 'Delivery Address',
    @filterValue VARCHAR(300)  = '%%'
AS
    SELECT * FROM OrderBatch WHERE @filterField LIKE @filterValue;
GO

这有两个问题:

  1. @filterField 不是准确的列名,因为它是从表示层传入的,所以我必须将它的值映射到正确的列(有时甚至是计算值)。即使它是一个确切的列名,我也不认为它在语法上有效。

  2. @filterValue 可能必须采用不同的格式,具体取决于 @filterField。所以有时我需要将它转换为 DATETIME 或类似的东西。这也意味着,对于某些列,我不能使用 LIKE 关键字,我必须使用 = (即如果它是 DATETIME)。

我在网上找遍了,发现了很多使用 case 语句的场景,但我永远无法让它与我的场景一起工作。它们都只适用于价值。所以我也尝试将它应用到我的专栏中:

CASE WHEN @filterField='Full Address' THEN [OrderItem].[ADDRESS] END LIKE @filterValue,
CASE WHEN @filterField='Delivery Contact Phone' THEN [Customer].[Delivery_Contact_Phone] END LIKE @filterValue

但似乎没有任何效果。我尝试的所有内容都无法在第一个 case 语句中编译。

所以:

如何让@filterField指定要使用的列和@filterValue的转换?

使用 EXEC

的动态 SQL 命令
CREATE PROCEDURE [dbo].[spGetOrderBatchesFiltered]
    @filterField VARCHAR(50) = 'Delivery Address',
    @filterValue VARCHAR(300)  = '%%'
AS
    DECLARE @sqlCommand varchar(1000)
    SET @sqlCommand = 'SELECT * FROM OrderBatch WHERE ' + @filterField  + ' like ' + @filterValue
    EXEC (@sqlCommand)
GO