在 SQL Server 中设置变量值时存在条件。

34
Declare @CategoryID as int
BEGIN  
    SELECT 
    (CASE 
        WHEN EXISTS(
            SELECT t0.Categoryid AS [EMPTY]
            FROM Categories AS [t0]
            WHERE [t0].Categoryname = @CategoryName
           ) THEN 1
        ELSE 0
     END) AS [value]

我希望在exists块内使用t0.Categoryid设置我的变量。如何做到这一点?

我想把then 1替换为类别ID值……


1
然后1变成了然后设置@CategoryId = 1。更好的方法是...选择CategoryId =(case....) - Joe Taras
2
我想将@categoryid设置为select语句的值。 - Vishal Sharma
1
@JoeTaras - 你绝对不能CASE语句内部使用SET语句。SET @c = CASE WHEN x THEN y ELSE z END是有效的,但是CASE WHEN x THEN SET @c = y ELSE SET @c = z END肯定是无效的。 - MatBailie
1
@MatBailie:是的,我已经更新了我的评论,加入了SELECT @categoryId = (case...) - Joe Taras
7个回答

43
Declare @CategoryID as int
SET @CategoryID =  CASE WHEN EXISTS(SELECT 1
                                    FROM  Categories
                                    WHERE Categoryname = @CategoryName)
                     THEN 1 ELSE 0
                   END

另一种方式可能是类似于...

IF EXISTS (SELECT 1
           FROM  Categories
           WHERE Categoryname = @CategoryName)
 BEGIN
   SET @CategoryID = 1;
 END
ELSE
 BEGIN
   SET @CategoryID = 0;
 END

7
CategoryID永远不会被设置为“category id value”,如问题所述。 - t-clausen.dk
1
@t-clausen.dk 我也没有在任何地方将它设置为categoryID :) 如果你阅读逻辑,它将始终设置为1或0。 - M.Ali
5
但问题是要将它设置为 categoryId 而不是 1 或 0。 - Igor Meszaros

15

我的看法...

DECLARE @any BIT = 0
SELECT TOP 1 @any = 1 FROM Categories WHERE CategoryName = @CategoryName

IF (@any = 1)
  PRINT 'Yes'
ELSE
  PRINT 'No'

1
这很好,尽管 OP 要求的是类别 ID,因此它应该是一个 int,查询应该是 @any = Categoryid。 :) 最后,为了安全起见,我会在每个语句后添加 ; - Andrew

9
这将返回分类 ID(如果存在),如果不存在则返回 0。
SET @CategoryID = null;

SELECT @CategoryID = t0.Categoryid
FROM Categories AS [t0]
WHERE [t0].Categoryname = @CategoryName;

IF @CategoryID IS NULL
    SET @CategoryID = 0;

SELECT @CategoryID AS [value];

然而,我建议如果不存在就只返回 null,或者返回一个额外的 @Exists (BIT) 来指示其是否存在。


3
Declare @CategoryID as int
SET @CategoryID =
            (SELECT t0.Categoryid AS [EMPTY]
            FROM Categories AS [t0]
            WHERE [t0].Categoryname = @CategoryName)
SET @CategoryID =COALESCE(@CategoryID ,0)

2
你可以尝试像这样做。
Declare @CategoryID as int
 Set @CategoryID =0;
    SELECT @CategoryID=t0.Categoryid
    FROM Categories AS [t0]
    WHERE [t0].Categoryname = @CategoryName

如果分类名称已存在,则将其分配给该类别的类别ID,否则它将保持为零。

1
我被迫使用exists块..有什么建议吗? - Vishal Sharma
2
为什么你被迫使用它? - Madhivanan
1
@vishalsharma 我认为你不能在Exists块内设置类别ID,因为Exists仅用于确定表中是否包含行。 - Amit Singh

0

你可以用几行代码实现这种方法

DECLARE @CategoryID int
SELECT @CategoryID = Categoryid FROM Categories WHERE Categoryname = @CategoryName

IF @CategoryID IS NULL
    THROW 50000, N'not found', 1 -- do something
    
SELECT @CategoryID -- the Categoryid value

0

这个答案来自于微软论坛,由David Dye提供,但在我的情况下非常准确:

DECLARE @permissionID INT;

IF EXISTS(SELECT Id FROM Permission WHERE [Description] = 'SettlementReport')
    SET @permissionID = (SELECT Id FROMPermission
    WHERE [Description] = 'SettlementReport')

原始答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接