我在两个我认为相同的陈述之间得到了不同的回应:println "date : " +params.endDate"
vs SELECT COUNT(*)
。在大约49次执行中,这两个陈述表现相同,但偶尔却没有。
我的猜测是,这些语句如何处理锁定的页面或者某些东西可能会更加“远远超出”。我的问题是这有什么区别?
我最初在我的SPROC中添加了一些日志记录(STATEMENT 3),这就是我看到它们具有不同值的方式。由于在执行此SPROC时NOT EXISTS
的内容可能会发生变化,我是否添加了STATEMENT#3,以便在TableWithResults
之前和之后确认COUNT(*)
的结果:
NOT EXISTS
我所看到的是-- STATEMENT 1: If this is returning 1...
SET @MatchingResultCount1 = ( SELECT COUNT (*) FROM TableWithResults WHERE SearchId = @SearchId )
-- STATEMENT 2: ...I expect this to evaluate "False" and sets IS_VALID='Y'
IF NOT EXISTS ( SELECT * FROM TableWithResults WHERE SearchId = @SearchId )
SET @IS_VALID = 'N';
ELSE
SET @IS_VALID = 'Y';
-- STATEMENT 3: This is to confirm the table didn't change
SET @MatchingResultCount1 = ( SELECT COUNT (*) FROM TableWithResults WHERE SearchId = @SearchId )
和@MatchingResultCount1
100%始终相同。 几乎 @MatchingResultCount2
@IS_VALID = 'Y'
,@MatchingResultCount1 > 0
{1/1} {1/1} {/ 1}}。{/ 1>
我尝试在所有陈述中使用@IS_VALID = 'N'
,这似乎没有什么区别。
答案 0 :(得分:4)
您应该更喜欢NOT EXISTS
而不是COUNT(*)
,原因很简单:
当您说COUNT(*)
时,数据库并不知道您并不真正关心完全行数。因此,只要找到至少匹配WHERE
子句的一行,它就无法跳过剩余的结果。
现在,作为副作用,如果COUNT(*)
设法跳过行,这也可能导致NOT EXISTS
查询获取的锁比NOT EXISTS
查询更多。这取决于数据库(我不确定SQL Server)
答案 1 :(得分:0)
你可以在这里简化你的逻辑。
DECLARE @IS_VALID char(1) = 'N'
IF EXISTS ( SELECT * FROM TableWithResults WHERE SearchId = @SearchId )
SET @IS_VALID = 'Y';
我不明白你对锁定页面的看法。运行查询时返回的值始终相同。如果在此表中有其他事务锁定页面,则可以在执行期间的不同时刻获得不同的结果。
答案 2 :(得分:-1)
在SQL
declare @countvariable int
set @countvariable = (select count(*) from tablename where columname = @parametername)
if(@countvariable =0)
begin
insert condition
end
else
begin
update condition
end