如何在多个 select 语句不靠近时合并它们?

How to union multiple select statements while they are not near together?

我有一个 sql 查询,它检查某些记录是否存在,如果这些记录存在则对它们产生错误,否则将它们插入数据库。在我的查询中,因为我需要 return 每条记录的错误消息,我需要 select 一些自定义文本,问题是它们显示为单独的 table,而不是一个 table,这是我想要的(因为我从 nodejs 应用程序调用此查询,它 return 对我来说是一个数组,所以它对我来说只有 return 第一个 table (错误消息) ).

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

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

正如我提到的,我希望所有这些 select 语句显示在一个 table 中,这样它们 return 作为一个数组发送到我的服务器。
我只是觉得提一下我的查询在一个循环中完成是很好的,所以它可能有不同数量的 IF...ELSE (在 --- 行之间)。

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

我不明白你真正想在那里做什么,但这里有一个使用 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,您可以在其中查看它的工作原理。

试试这个,有用:

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