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