检查SELECT是否在存储过程中返回任何行

时间:2013-10-10 16:56:23

标签: sql sql-server stored-procedures

我正在编写基本的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**

5 个答案:

答案 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