Sql server 使用变量筛选多个列

Sql server 使用变量筛选多个列,sql-server,tsql,parameters,multiple-columns,where-clause,Sql Server,Tsql,Parameters,Multiple Columns,Where Clause,我有一个如下所示的SQL表: 我希望能够根据变量值过滤列 例如有时仅@BI_ResponsibleID,有时@CategoryID和@ChangeRequestorID等等 我可以用我的变量来实现这一点吗?尝试以下方法: 声明@BI_ResponsibleID INT、@CategoryID INT、@ChangeRequestorID INT SET @BI_ResponsibleID = 5 SET @CategoryID = 3 SET @ChangeRequestorID = 4 S

我有一个如下所示的SQL表:

我希望能够根据变量值过滤列

例如有时仅@BI_ResponsibleID,有时@CategoryID和@ChangeRequestorID等等


我可以用我的变量来实现这一点吗?

尝试以下方法:

声明@BI_ResponsibleID INT、@CategoryID INT、@ChangeRequestorID INT

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
     [BI_ResponsibleID],
     [CategoryID],
     [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE (ISNULL([BI_ResponsibleID],0) = @BI_ResponsibleID) 
    AND (ISNULL([CategoryID],0) = @CategoryID)
    AND (ISNULL([ChangeRequestorID],0) = @ChangeRequestorID)

试着这样做:

声明@BI_ResponsibleID INT、@CategoryID INT、@ChangeRequestorID INT

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
     [BI_ResponsibleID],
     [CategoryID],
     [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE (ISNULL([BI_ResponsibleID],0) = @BI_ResponsibleID) 
    AND (ISNULL([CategoryID],0) = @CategoryID)
    AND (ISNULL([ChangeRequestorID],0) = @ChangeRequestorID)
我为您提供的解决方案:

像这样使用空参数的默认值

SET @BI_ResponsibleID = ISNULL(@BI_ResponsibleID, 0 );
SET @CategoryID = ISNULL(@CategoryID, 0 );
SET @ChangeRequestorID = ISNULL(@ChangeRequestorID, 0 );
试试这个:

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE (@BI_ResponsibleID = 0 OR [BI_ResponsibleID] = @BI_ResponsibleID)
  AND (@CategoryID = 0 OR [CategoryID] = @CategoryID)
  AND (@ChangeRequestorID = 0 OR [ChangeRequestorID] = @ChangeRequestorID)
我为您提供的解决方案:

像这样使用空参数的默认值

SET @BI_ResponsibleID = ISNULL(@BI_ResponsibleID, 0 );
SET @CategoryID = ISNULL(@CategoryID, 0 );
SET @ChangeRequestorID = ISNULL(@ChangeRequestorID, 0 );
试试这个:

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE (@BI_ResponsibleID = 0 OR [BI_ResponsibleID] = @BI_ResponsibleID)
  AND (@CategoryID = 0 OR [CategoryID] = @CategoryID)
  AND (@ChangeRequestorID = 0 OR [ChangeRequestorID] = @ChangeRequestorID)

您可以使用下面的动态查询。我假设如果变量的值为零,则不希望对该列进行筛选

// Not tested code
DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 
DECLARE @sqlCommand nvarchar(1000)


SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SET @sqlCommand = 'TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity] where 1 = 1 '

if(@BI_ResponsibleID != 0)
 set @sqlCommand +=  'AND BI_ResponsibleID = @BI_ResponsibleID '

 if(@CategoryID != 0)
 set @sqlCommand +=  'AND CategoryID = @CategoryID ' 

 if(@ChangeRequestorID != 0)
 set @sqlCommand +=  'AND ChangeRequestorID = @ChangeRequestorID '

EXEC sp_executesql @sqlCommand, N'@BI_ResponsibleID INT, @CategoryID INT, @ChangeRequestorID INT', @BI_ResponsibleID, @CategoryID, @ChangeRequestorID;

您可以使用下面的动态查询。我假设如果变量的值为零,则不希望对该列进行筛选

// Not tested code
DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 
DECLARE @sqlCommand nvarchar(1000)


SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SET @sqlCommand = 'TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity] where 1 = 1 '

if(@BI_ResponsibleID != 0)
 set @sqlCommand +=  'AND BI_ResponsibleID = @BI_ResponsibleID '

 if(@CategoryID != 0)
 set @sqlCommand +=  'AND CategoryID = @CategoryID ' 

 if(@ChangeRequestorID != 0)
 set @sqlCommand +=  'AND ChangeRequestorID = @ChangeRequestorID '

EXEC sp_executesql @sqlCommand, N'@BI_ResponsibleID INT, @CategoryID INT, @ChangeRequestorID INT', @BI_ResponsibleID, @CategoryID, @ChangeRequestorID;

因为我没有表和数据,所以无法检查此查询。但这就是你实现它的方法

DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE ( 1 = 1 OR ( @BI_ResponsibleID IS NOT NULL AND  Some Other condition using @BI_ResponsibleID))
    AND ( 1 = 1 OR ( @CategoryID IS NOT NULL AND  Some Other condition using @CategoryID))
    AND ( 1 = 1 OR ( @ChangeRequestorID IS NOT NULL AND  Some Other condition using @ChangeRequestorID))

因为我没有表和数据,所以无法检查此查询。但这就是你实现它的方法

DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE ( 1 = 1 OR ( @BI_ResponsibleID IS NOT NULL AND  Some Other condition using @BI_ResponsibleID))
    AND ( 1 = 1 OR ( @CategoryID IS NOT NULL AND  Some Other condition using @CategoryID))
    AND ( 1 = 1 OR ( @ChangeRequestorID IS NOT NULL AND  Some Other condition using @ChangeRequestorID))

您需要做的是,包括
条件以检查
NULL
参数,如下所示:

DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE 
    (BI_ResponsibleID = @BI_ResponsibleID OR @BI_ResponsibleID IS NULL)
    AND (CategoryID = @CategoryID OR @CategoryID IS NULL)
    AND (ChangeRequestorID = @ChangeRequestorID OR @ChangeRequestorID IS NULL)
CREATE PROCEDURE MyProcName
    @BI_ResponsibleID = NULL
    @CategoryID = NULL
    @ChangeRequestorID = NULL

AS

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE 
    (BI_ResponsibleID = @BI_ResponsibleID OR @BI_ResponsibleID IS NULL)
    AND (CategoryID = @CategoryID OR @CategoryID IS NULL)
    AND (ChangeRequestorID = @ChangeRequestorID OR @ChangeRequestorID IS NULL)

END
您可能希望通过存储过程执行此操作,如下所示:

DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE 
    (BI_ResponsibleID = @BI_ResponsibleID OR @BI_ResponsibleID IS NULL)
    AND (CategoryID = @CategoryID OR @CategoryID IS NULL)
    AND (ChangeRequestorID = @ChangeRequestorID OR @ChangeRequestorID IS NULL)
CREATE PROCEDURE MyProcName
    @BI_ResponsibleID = NULL
    @CategoryID = NULL
    @ChangeRequestorID = NULL

AS

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE 
    (BI_ResponsibleID = @BI_ResponsibleID OR @BI_ResponsibleID IS NULL)
    AND (CategoryID = @CategoryID OR @CategoryID IS NULL)
    AND (ChangeRequestorID = @ChangeRequestorID OR @ChangeRequestorID IS NULL)

END

您需要做的是,包括
条件以检查
NULL
参数,如下所示:

DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE 
    (BI_ResponsibleID = @BI_ResponsibleID OR @BI_ResponsibleID IS NULL)
    AND (CategoryID = @CategoryID OR @CategoryID IS NULL)
    AND (ChangeRequestorID = @ChangeRequestorID OR @ChangeRequestorID IS NULL)
CREATE PROCEDURE MyProcName
    @BI_ResponsibleID = NULL
    @CategoryID = NULL
    @ChangeRequestorID = NULL

AS

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE 
    (BI_ResponsibleID = @BI_ResponsibleID OR @BI_ResponsibleID IS NULL)
    AND (CategoryID = @CategoryID OR @CategoryID IS NULL)
    AND (ChangeRequestorID = @ChangeRequestorID OR @ChangeRequestorID IS NULL)

END
您可能希望通过存储过程执行此操作,如下所示:

DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE 
    (BI_ResponsibleID = @BI_ResponsibleID OR @BI_ResponsibleID IS NULL)
    AND (CategoryID = @CategoryID OR @CategoryID IS NULL)
    AND (ChangeRequestorID = @ChangeRequestorID OR @ChangeRequestorID IS NULL)
CREATE PROCEDURE MyProcName
    @BI_ResponsibleID = NULL
    @CategoryID = NULL
    @ChangeRequestorID = NULL

AS

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE 
    (BI_ResponsibleID = @BI_ResponsibleID OR @BI_ResponsibleID IS NULL)
    AND (CategoryID = @CategoryID OR @CategoryID IS NULL)
    AND (ChangeRequestorID = @ChangeRequestorID OR @ChangeRequestorID IS NULL)

END

您想用一个或多个变量筛选结果?动态查询是一个选项。您想用一个或多个变量筛选结果?动态查询是一个选项。如果我只想在@CategoryID=3上筛选,并将BI_ResponsibleID和ChangeRequestorID留空,会发生什么情况?@Nils在这种情况下,查询也会工作。它将@CategoryID=3,其他条件为空。唯一需要注意的是,您需要给出
set@ChangeRequestorID=NULL
set@BI_ResponsibleID=NULL
如果我只想在@CategoryID=3上进行筛选,并将BI_ResponsibleID和ChangeRequestorID留空,会发生什么情况?@Nils在这种情况下,查询也会工作。它将@CategoryID=3,其他条件为空。唯一需要注意的是,您需要在这里大量使用动态SQL,并了解其他使用“捕获所有查询”(这可能会严重影响性能问题)的答案。然而,我承认,我不喜欢使用
1=1
;它可以使查询分析器做出奇怪的决定。如果您可以添加逻辑来绕过它的使用,它会更好。:)我得到一个错误:过程需要类型为“ntext/nchar/nvarchar”的参数“@statement”。@Nils-更新了answer问题中
@sqlCommand
的类型,现在应该修复了。这里大量使用动态SQL,而get则围绕使用“捕获所有查询”(这可能会严重影响性能问题)的其他答案展开。然而,我承认,我不喜欢使用
1=1
;它可以使查询分析器做出奇怪的决定。如果您可以添加逻辑来绕过它的使用,它会更好。:)我得到一个错误:过程需要类型为“ntext/nchar/nvarchar”的参数“@statement”。@Nils-更新了应答问题中
@sqlCommand
的类型,现在应该修复了。