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
这有两个问题:
@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
的转换?
使用 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
我有一个带过滤器的存储过程。
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
的转换?
使用 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