如何在多个 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
我有一个 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