SQL动态参数化字段和值的位置

时间:2018-08-10 12:46:23

标签: sql sql-server where-clause

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

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的转换?

1 个答案:

答案 0 :(得分:0)

使用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