我正在编写基本的SELECT
查询,例如:
SELECT id, pname, pnumber
FROM tableName
WHERE pnumber IS NOT NULL
我想通过使用INSERT
的结果来执行SELECT
,如下所示:
IF {**the above SELECT query returned 0 rows**}
BEGIN
INSERT INTO tableName (pname,pnumber) VALUES ('bob', '38499483')
END
我的问题是,如何查看**the above SELECT query returned 0 rows**
?
答案 0 :(得分:31)
IF NOT EXISTS (SELECT ...)
BEGIN
INSERT ...
END
如果您希望查询可能经常返回行(尤其是很多行),您也可以这样做,这可能提供更好的短路机会:
IF EXISTS (SELECT ...)
BEGIN
PRINT 'Do nothing.';
END
ELSE
BEGIN
INSERT ...
END
...因为IF EXISTS
会在匹配匹配的第一行后立即返回。
我不建议仅使用@@ROWCOUNT
,因为您每次都必须实现(并忽略)完整的结果集。
答案 1 :(得分:4)
在MySQL中检查否。最后一个选择查询返回的行数
select FOUND_ROWS();
答案 2 :(得分:2)
您可以使用@@ROWCOUNT
SELECT id, pname, pnumber
FROM tableName
WHERE pnumber IS NOT NULL
在此之后选择@@ROWCOUNT
IF @@ROWCOUNT = 0
BEGIN
INSERT ...
END
通过这种方式,您可以返回一些数据并检查是否有结果
答案 3 :(得分:0)
我看到人们对这种逻辑存在设计模式问题。
1 - 测试记录的存在
2 - 如果不存在,请插入记录。
特别是如果并发发挥作用。根据隔离级别,您可能会有重复的数据或密钥违规。
为什么不首先在pname和pnumber上放置主键。我假设你在谈论一个人桌。
我的例子。
--
-- Setup sample table w/data
--
-- Sample table
create table #person
(
person_id int identity (1, 1),
person_name varchar(64) not null,
person_no varchar(16) not null
);
go
-- primary key
alter table #person
add primary key (person_no, person_name)
go
-- first insert works
insert into #person (person_name, person_no) values ('bilbo', 123)
go
解决方案的关键是捕获主键违规。根据您的业务逻辑,忽略此错误可能是好的也可能是坏的。
我决定忽略这个问题。
--
-- Ignore primary key violations
--
-- Try these steps
BEGIN TRY
-- Second insert fails
insert into #person (person_name, person_no) values ('bilbo', 123)
END TRY
-- Error Handler
BEGIN CATCH
-- Ignore PK error
IF ERROR_NUMBER() <> 2627
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
此解决方案可消除重复条目,并且不会报告PK违规行为。
答案 4 :(得分:0)
代码为:
EXEC(SELECT * FROM Table_Name)
IF (@@ROWCOUNT>1) --@@ROWCOUNT is the count number of return's rows
BEGIN
// code here
END