好的,所以我花了一些时间研究这个,但似乎无法找到一个好的解决方案。
我目前正在创建一个带有一组可选参数的存储过程。存储过程将充当"通用搜索查询"用于多个表和列。
存储过程看起来像这样(请记住,这只是一个精简版本,实际存储过程有更多列等。)
' @ProductIdsParam IntList READONLY'是一个示例表值参数,如果它不为空,我想加入。换句话说,查询应该只搜索非空/空的参数。
调用该过程并解析其他参数就像它应该的那样工作。然而,我可能会误解,不应该做一个"通用搜索查询"像这样。
CREATE PROCEDURE [dbo].[usp_Search]
@ProductIdParam INT = NULL,
@CustomerNameParam NVARCHAR(100) = NULL,
@PriceParam decimal = NULL,
-- THIS IS WHAT I'D LIKE TO JOIN. BUT THE TABLE CAN BE EMPTY
@ProductIdsParam IntList READONLY
AS
BEGIN
SET NOCOUNT ON;
SELECT DISTINCT
CustomerTransactionTable.first_name AS FirstName,
CustomerTransactionTable.last_name AS LastName,
ProductTable.description AS ProductDescription,
ProductTable.price as ProductPrice
FROM dbo.customer AS CustomerTransactionTable
-- JOINS
LEFT JOIN dbo.product AS ProductTable
ON CustomerTransactionTable.product_id = ProductTable.id
WHERE
(ProductTable.id = @ProductIdParam OR @ProductIdParam IS NULL)
AND (CustomerTransactionTable.first_name = @CustomerNameParam OR @CustomerNameParam IS NULL)
AND (CustomerTransactionTable.price = @PriceParam OR @PriceParam IS NULL)
END
答案 0 :(得分:2)
您可以在LEFT联接中添加int表,然后根据筛选表中的记录计数添加where条件。如果将@ProductIdsParam声明为表,则应首先计算其中的记录并将结果存储在变量中。
AND COALESCE(@ProductIdsParam.id, 0) = (CASE WHEN @ProductIdsCount = 0 THEN 0 ELSE ProductTable.id END)
如果@ProductIdsCount = 0,那么你总是得到0 = 0所以你得到所有记录,否则你只选择过滤表中productId等于ProductTable.id的记录。
虽然可能有其他(可能更干净)的方法,但我认为这有效。