where 子句中的存储过程空参数

Mat*_*ics 6 sql-server t-sql sql-server-2012

我想在 where 子句中使用一个参数,仅当它的值由强类型数据集提供时,这是我目前正在尝试的,当我提供时我得到正确的结果,parameter3而当我不提供它的值时没有结果。

我想要的是,当我没有为 提供值时parameter3,它不应该在查询中使用它,因为它的值为空,我想查看查询中的所有结果,而不是where Paramerter3 = null

ALTER procedure [dbo].[GetData]
(
    @Parameter1 varchar(256),
    @Parameter2 varchar(256),
    @Parameter3 int = null
)
AS

SELECT
    *
FROM
    Table1
WHERE
    Table1.URL LIKE '%' + @Parameter1 + '%' 
    AND Table1.ID = @Parameter2
    AND (@Parameter3 IS NULL OR Table1.ID2 = @Parameter3)
ORDER BY
    Table1.Title
Run Code Online (Sandbox Code Playgroud)

编辑:我试过托马斯的回答并像这样执行:

EXEC @return_value = [dbo].[GetData]
                              @Parameter1 = N'asda',
                              @Parameter2 = N'asda',
                              @Parameter3 = null

SELECT  'Return Value' = @return_value
GO
Run Code Online (Sandbox Code Playgroud)

正如托马斯所说,我还更新了存储过程。

Tho*_*ger 15

SELECT *
FROM Table1
WHERE Table1.URL LIKE '%' + @Parameter1 + '%' AND Table1.ID = @Parameter2
AND 
(
    @Parameter3 is null 
    or Table1.ID2 = @Parameter3
);
Run Code Online (Sandbox Code Playgroud)

看看上面的例子。如果您将 AND 子句更改为嵌套的 OR 子句,则指定您的初始表达式以及@Parameter3 is null. 如果@Parameter3 为NULL,那么这将要求嵌套表达式为真。

  • 不要做`@param = null`。你需要做`@param is null`。没有任何东西可以“等于”NULL。 (3认同)
  • 或者如果您喜欢 SQL 标准和所有这些,请使用`COALESCE` (2认同)

bil*_*nkc 12

对于此类问题,我一直是动态 sql 方法的粉丝。我发现它提供了复杂性与质量查询计划之间的最佳平衡。

在下面的代码中,我定义了一个基本查询,它执行它需要执行的任何操作,然后仅在提供的参数不为空时才添加过滤器。

CREATE PROCEDURE [dbo].[GetData]
(
    @Parameter1 varchar(256),
    @Parameter2 varchar(256),
    @Parameter3 int = null
)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE 
        @BaseQuery nvarchar(max) = N'SELECT T.* FROM dbo.Table1 AS T'
    ,   @ParamList nvarchar(max) = N'@p1 varchar(256), @p2 varchar(256), @p3 int'
    ,   @WhereClause nvarchar(max) = ' WHERE 1=1';

    IF @Parameter1 IS NOT NULL
    BEGIN
        SET @WhereClause = @WhereClause + ' AND T.Url = @p1';
    END

    IF @Parameter2 IS NOT NULL
    BEGIN
        SET @WhereClause = @WhereClause + ' AND T.ID = @p2';
    END

    IF @Parameter3 IS NOT NULL
    BEGIN
        SET @WhereClause = @WhereClause + ' AND T.ID2 = @p3';
    END

    SET @BaseQuery = @BaseQuery + @WhereClause;

    EXECUTE sp_executesql @BaseQuery, @ParamList, @p1 = @Parameter1, @p2 = @Parameter2, @p3 = @Parameter3;
END
Run Code Online (Sandbox Code Playgroud)