我正在使用SQL Server 2016(Express)
我正在使用类似的查询,根据是否已经存在相同的记录来决定是插入还是找到记录。
IF EXISTS (SELECT 1 FROM Divisions WHERE Title = '$Title')
BEGIN
SELECT NEWID = DIVISIONID, CREATED = 'FALSE' FROM Divisions WHERE Title = '$Title'
END
ELSE
BEGIN
INSERT INTO DIVISIONS(Title)
VALUES('$Title')
SELECT CREATED = 'True", NEWID = SCOPE_IDENTIY()
END
在第一次选择中重复了EXISTS语句中的WHERE条件,需要做更多的工作,需要维护更多,并且两次进行相同的扫描。
我认为我可以将其更改为此。 我试图了解为什么该查询不起作用。
SELECT NEWID = DivisionID, CREATED = 'False'
FROM Divisions D2
WHERE Title = '$Title'
IF (@@ROWCOUNT = 0)
BEGIN
INSERT INTO Divisions (Title)
VALUES('$Title')
SELECT NEWID = SCOPE_IDENTITY(), CREATED = 'TRUE'
END
如果没有匹配项,此查询将始终不返回任何行。
预期的匹配行为是(这确实发生了)
否则,预期的行为是
但是这种类似的代码有效。
DECLARE @OBJECTID INT = 0
SELECT @OBJECTID = DivisionID
FROM Divisions D2
WHERE Title = '$Title'
IF (ISNULL(@OBJECTID,0) = 0)
BEGIN
INSERT INTO Divisions (Title)
VALUES('$Title')
SELECT NEWID = SCOPE_IDENTITY(), CREATED = 'TRUE'
END
ELSE
BEGIN
SELECT NEWID = @OBJECTID, CREATED = 'FALSE'
END
除了简化INSERT语句和WHERE条件之外,这些都是完整的查询。表格上没有触发器或外来索引。