Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 如果参数为-1,则选择所有记录_Tsql_Stored Procedures_Parameters - Fatal编程技术网

Tsql 如果参数为-1,则选择所有记录

Tsql 如果参数为-1,则选择所有记录,tsql,stored-procedures,parameters,Tsql,Stored Procedures,Parameters,我知道这是一个基本问题,但我似乎无法找到正确的搜索词组合来获得我需要的答案 我正在处理一个存储过程,其中有一个名为@AccountTypeId的参数。参数可以是1,2,3,或-1。如果@AccountTypeId是-1,它应该返回所有的帐户类型(1、2和3)。我可以很容易地编写一个SP,它将根据@AccountTypeId进行过滤: CREATE PROCEDURE Accounts_SP (@AccountTypeId INT) AS SELECT * FROM Accounts WHERE

我知道这是一个基本问题,但我似乎无法找到正确的搜索词组合来获得我需要的答案

我正在处理一个存储过程,其中有一个名为
@AccountTypeId
的参数。参数可以是
1
2
3
,或
-1
。如果
@AccountTypeId
-1
,它应该返回所有的帐户类型(
1
2
3
)。我可以很容易地编写一个SP,它将根据
@AccountTypeId
进行过滤:

CREATE PROCEDURE Accounts_SP (@AccountTypeId INT)
AS
SELECT *
FROM Accounts
WHERE AccountTypeId = @AccountTypeId
问题是当
@AccountTypeId
-1
时,SP返回所有
AccountType
s

我尝试在
WHERE
子句中使用
CASE
语句,如下所示:

CREATE PROCEDURE Accounts_SP (@AccountTypeId INT)
AS
SELECT *
FROM Accounts
WHERE AccountTypeId IN (CASE @AccountTypeId WHEN -1
                            THEN (SELECT AccountTypeId FROM AccountTypes) 
                            ELSE @AccountTypeId 
                        END)
但它给了我以下错误:

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时


我相信有一个简单的方法可以得到所有的记录,我只是把事情复杂化了。有人能给我指出正确的方向吗?

您可以使用OR语句,如果您发送-1并选择所有行,这当然总是正确的

SELECT *
FROM Accounts
WHERE AccountTypeId = @AccountTypeId
OR @AccountTypeId = -1

您可以使用OR语句,当然,如果您发送in-1并因此选择所有行,则OR语句总是正确的

SELECT *
FROM Accounts
WHERE AccountTypeId = @AccountTypeId
OR @AccountTypeId = -1

每次我遇到这个需求时(通常是这样),我都会使用SQL Server中的函数。COALESCE返回第一个非空值,因此它将是这样的。注意@Param已更改为支持NULL

CREATE PROCEDURE Accounts_SP (@AccountTypeId INT = NULL)
AS
SELECT *
FROM Accounts
WHERE AccountTypeId = COALESCE(@AccountTypeId, AccountTypeId)

每次我遇到这个需求时(通常是这样),我都会使用SQL Server中的函数。COALESCE返回第一个非空值,因此它将是这样的。注意@Param已更改为支持NULL

CREATE PROCEDURE Accounts_SP (@AccountTypeId INT = NULL)
AS
SELECT *
FROM Accounts
WHERE AccountTypeId = COALESCE(@AccountTypeId, AccountTypeId)

我就知道是这么简单。期限到了我就接受答复。非常感谢。我就知道是这么简单。期限到了我就接受答复。非常感谢。