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,那么这将要求嵌套表达式为真。
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)
归档时间: |
|
查看次数: |
71588 次 |
最近记录: |