当它们不在一起时,如何合并多个选择语句?

时间:2019-07-02 18:13:37

标签: sql sql-server sqltransaction

我有一个sql查询,检查某些记录是否存在,如果这些记录存在,则它们会出现错误,否则将它们插入数据库。在我的查询中,因为我需要为每条记录返回错误消息,所以我需要选择一些自定义文本,问题在于它们显示为单独的表,而不是我想要的一个表(因为我从nodejs应用调用此查询)并且会为我返回一个数组,因此它只会为我返回第一个表(错误消息)。

我搜索并找到了这两个选项:
1-使用UNION(无法解决我的情况)
2-将所有记录插入另一个表中,然后获取所有记录(这并不漂亮!:))

DECLARE @errorCOUNT int
SET @errorCOUNT = 0
BEGIN TRANSACTION [Tran1]
IF EXISTS (SELECT * FROM Categories WHERE CategoryName = 'myCat1')
BEGIN
    SELECT 'This is error for is = 4' As err
    SET @errorCOUNT = @errorCOUNT + 1
END
ELSE
BEGIN
    INSERT INTO Categories VALUES ('myCat1')
END
----------------------------
IF EXISTS (SELECT * FROM Categories WHERE CategoryName = 'myCat2')
BEGIN
    SELECT 'This is error for is = 5' AS err
    SET @errorCOUNT = @errorCOUNT + 1
END
ELSE
BEGIN
    INSERT INTO Categories VALUES ('myCat2')
END
----------------------------
IF @errorCOUNT > 0
BEGIN
    ROLLBACK TRANSACTION [Tran1]
END
ELSE 
BEGIN
    COMMIT TRANSACTION [Tran1]
END

What I got (image)

正如我提到的,我希望所有这些select语句都显示在一个表中,以便它们作为一个数组返回到我的服务器。
我只是认为值得一提的是,我的查询是在循环中完成的,因此它可能有不同数量的IF...ELSE(在---行之间)。

我希望我很清楚。提前致谢。

2 个答案:

答案 0 :(得分:1)

我不知道您在这里真正想做什么,但是这里有一个使用MERGE语句和OUTPUT子句的提示,也许这就是您想要的

DECLARE @T TABLE(CategoryName VARCHAR(45));

MERGE INTO T
USING (VALUES('MyCat1'), ('MyCat2')) TT(CategoryName)
ON T.CategoryName = TT.CategoryName -- Or <> instead of =
WHEN NOT MATCHED THEN
INSERT VALUES(TT.CategoryName)
OUTPUT TT.CategoryName INTO @T;

SELECT CASE WHEN CategoryName = 'MyCat1'
            THEN 'This is error for is = 4'
            WHEN CategoryName = 'MyCat2'
            THEN 'This is error for is = 5' 
       END Res
FROM @T;

此外,我认为您不需要@ErrorCount变量,因为您已经有了@@ROWCOUNT可以使用它。

这里是db<>fiddle,您可以在其中查看其工作方式。

答案 1 :(得分:1)

尝试一下,将起作用:

BEGIN TRANSACTION [Tran1]
DECLARE @err AS TABLE ( msg NVARCHAR(MAX) NOT NULL )
DECLARE @errorCOUNT AS INT = 0
IF EXISTS (SELECT * FROM Categories WHERE CategoryName = 'myCat1')
BEGIN
  INSERT INTO @err (msg) VALUES ('This is error for is = 4')
  SET @errorCOUNT = @errorCOUNT + 1
END
ELSE
BEGIN
  INSERT INTO Categories VALUES ('myCat1')
END
IF EXISTS (SELECT * FROM Categories WHERE CategoryName = 'myCat2')
BEGIN
  INSERT INTO @err (msg) VALUES ('This is error for is = 5')
  SET @errorCOUNT = @errorCOUNT + 1
END
ELSE
BEGIN
  INSERT INTO Categories VALUES ('myCat2')
END
IF @errorCOUNT > 0
BEGIN
  SELECT * FROM @err
  ROLLBACK TRANSACTION [Tran1]
END
ELSE 
BEGIN
  COMMIT TRANSACTION [Tran1]
END