我有一个带有过滤器的存储过程。
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
与此有关的两个问题:
@filterField
并不是确切的列名,因为它是从表示层传入的,因此我必须将其值映射到右列(有时甚至是计算值)。即使是确切的列名,我也认为这在语法上不起作用。
@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
的转换?
答案 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