【问题标题】:How to check if a Cursor Select query has records如何检查光标选择查询是否有记录
【发布时间】:2018-01-31 19:36:21
【问题描述】:

我是存储过程的新手。我想要一个用于从表中选择记录的游标。如果记录可用,则插入另一个。如何在插入之前添加对选定行的检查。提前致谢。

例如:

DECLARE cursor_name CURSOR FOR 
        SELECT Id From tbl WHERE  where condition
OPEN cursor_name 

    FETCH NEXT FROM cursor_name INTO @id
    WHILE @@FETCH_STATUS = 0   
    BEGIN  
     Insert statement

【问题讨论】:

  • 这个检查就够了WHILE @@FETCH_STATUS = 0
  • 您确定要使用光标吗?如果您将记录从一个表插入到另一个表中,则不需要这样做,并且性能会很差。使用条件 INSERT 语句可能会更好。见这里:w3schools.com/sql/sql_insert_into_select.asp 问候,

标签: sql-server tsql stored-procedures cursor


【解决方案1】:

变量@@FETCH_STATUS 将仅在选择成功行的情况下返回 0,具体取决于您的 where 条件。您在问题中提供的代码足以处理它。您也可以参考下面的示例代码。在这段代码中,如果 column1 的值是偶数并丢弃奇数行,我将从 table1 插入行到 table2 -

-- CREATE Source table and add few records 
create table #Table1
(
Col1 int,
    col2 char(1)
)

insert into #Table1
select  1, 'A'
union all select  2, 'B'
union all select  3, 'C'
union all select  4, 'D'
union all select  5, 'E'
union all select  6, 'F'
union all select  7, 'G'
union all select  8, 'H'


--Create destination table 
create table #Table2
(
    Col1 int,
    col2 char(1)
)

declare @Col1 int,  @col2 char(1)  

-- below cursor will insert only evern rows from surce table to destination 
table 
DECLARE Cur1 CURSOR FOR  
SELECT   Col1,  col2
FROM #Table1
WHERE  col1%2 = 0   

OPEN Cur1   
FETCH NEXT FROM Cur1 INTO @Col1 ,@col2   

WHILE @@FETCH_STATUS = 0     -- this will return 0 only if a successful row is fatched 
BEGIN   
       insert into #Table2
       select @Col1 ,@col2       

       FETCH NEXT FROM Cur1 INTO @Col1 ,@col2     
END   

CLOSE Cur1   
DEALLOCATE Cur1

【讨论】:

  • 这里绝对不需要光标。它在此代码中执行一个功能...使其变慢。这应该是一个插入语句。
  • 完全同意你的看法。我们可以通过一个简单的 insert\select 语句来做到这一点。但是我正在回答问题的一个特定部分 - “如何在插入光标之前添加对选定行的检查”
  • 更好的答案是演示如何在此处消除光标并帮助 OP 学习更好的方法。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
相关资源
最近更新 更多