Sql server 2005 如何构建一个Select存储过程来处理来自表的任何请求?

Sql server 2005 如何构建一个Select存储过程来处理来自表的任何请求?,sql-server-2005,stored-procedures,Sql Server 2005,Stored Procedures,我想为SQL 2005构建一个单一的select存储过程,该过程对于该表上的任何select查询都是通用的 **Columns** LocationServiceID LocationID LocationServiceTypeID ServiceName ServiceCode FlagActive 对于此表,我可能需要按LocationServiceID、LocationID、LocationServiceTypeID或ServiceName或以上组合进行选择 我不希望每个存储过程都有单独

我想为SQL 2005构建一个单一的select存储过程,该过程对于该表上的任何select查询都是通用的

**Columns**
LocationServiceID
LocationID
LocationServiceTypeID
ServiceName
ServiceCode
FlagActive
对于此表,我可能需要按LocationServiceID、LocationID、LocationServiceTypeID或ServiceName或以上组合进行选择

我不希望每个存储过程都有单独的存储过程

我认为最好的方法是在NOTNULL上构建“WHERE”语句。差不多

SELECT * FROM LocationServiceType WHERE

  IF @LocationID IS NOT NULL (LocationID = @LocationID)
  IF @LocationServiceID IS NOT NULL (LocationServiceID = @LocationServiceID)
  IF @LocationServiceTypeID IS NOT NULL (LocationServiceTypeID = @LocationServiceTypeID)
  IF @ServiceName IS NOT NULL (ServiceName = @ServiceName)
  IF @ServiceCode IS NOT NULL (ServiceCode = @ServiceCode)
  IF @FlagActive IS NOT NULL (FlagActive = @FlagActive)

这有意义吗?

这是我见过的关于这个主题的最广泛的文章:

以下是这篇文章的概要:


首先,您的代码将无法工作。应该是这样的:

SELECT * FROM LocationServiceType WHERE
(@LocationID IS NULL OR (LocationID = @LocationID)
... -- all other fields here
这是完全有效的,称为“一体式查询”。但从性能的角度来看,只要不允许SQLServer选择最佳计划,这就不是一个完美的解决方案。你可以看到更多的细节


底线:如果您的首要任务是“单SP”,那么请使用这种方法。如果您关心性能,请寻找不同的解决方案。

我一直在做的是,如果在查询中应该忽略传入参数,则将其设置为null 然后首先检查变量是否为null,这样若变量为null,则会出现短路,且未应用过滤器。若变量有值,则“或”会导致使用过滤器。到目前为止,他一直在为我工作

SET @LocationID = NULLIF(@LocationID, 0)
SET @LocationServiceID = NULLIF(@LocationServiceID, 0)
SET @LocationServiceTypeID = NULLIF(@LocationServiceTypeID, 0)


    SELECT * FROM LocationServiceType WHERE

      (@LocationID IS NULL OR LocationID = @LocationID)
     AND (@LocationServiceID IS NULL OR LocationServiceID = @LocationServiceID)
     AND (@LocationServiceTypeID IS NULL OR @LocationServiceTypeID = @LocationServiceTypeID)
等等


如果传入空值,它将取消where子句的该行,否则它将返回与传入值匹配的行。

请问您为什么要这样做?如果where表示它们是条件,则不使用where,我知道这是不正确的语法。这只是给我想要的东西一个视觉表现的最简单的方法。至于“为什么”,因为我想让它更简单。是的,存储过程将更加复杂,但它将简化以后的维护。这一点,一旦我知道了怎么做,我可以为其他表这样做。+1 Erland应该在这里的常见问题解答中,或者他们应该添加一些逻辑来检测和自动链接……这是一篇很棒的文章。这篇文章真的表明,没有“正确的方法”,它总是取决于许多因素factors@WACM161,阅读我答案中链接的文章,它涵盖了此解决方案和可能的性能问题。这就是我最终使用的。因为我所做的就是完成任务,因为它是一个控制台应用程序,所以我不担心SQL注入或性能。
SET @LocationID = NULLIF(@LocationID, 0)
SET @LocationServiceID = NULLIF(@LocationServiceID, 0)
SET @LocationServiceTypeID = NULLIF(@LocationServiceTypeID, 0)


    SELECT * FROM LocationServiceType WHERE

      (@LocationID IS NULL OR LocationID = @LocationID)
     AND (@LocationServiceID IS NULL OR LocationServiceID = @LocationServiceID)
     AND (@LocationServiceTypeID IS NULL OR @LocationServiceTypeID = @LocationServiceTypeID)
SELECT * 
FROM LocationServiceType
WHERE LocationServiceID = ISNULL(@LocationServiceID,LocationServiceID)
  AND LocationID = ISNULL(@LocationID,LocationID)
  AND LocationServiceTypeID = ISNULL(@LocationServiceTypeID,LocationServiceTypeID)
  AND ServiceName = ISNULL(@ServiceName,ServiceName)
  AND ServiceCode = ISNULL(@ServiceCode,ServiceCode)
  AND FlagActive = ISNULL(@FlagActive,FlagActive)