【问题标题】:looping through recordset in stored procedure在存储过程中循环记录集
【发布时间】:2017-11-10 23:19:38
【问题描述】:

我创建了一个以 SELECT 语句为值的 tbl(字段名 sqltxt)。

现在要逐行读取并执行存储在此表中的所有选择语句。

如果它不返回任何行,即零行

在 DMSResults 中插入一条新记录,其值为来自 DMSRec 的 DOCID 为此,我使用以下脚本

set nocount on
use TESTDB
declare @sqlTXT as varchar(max);
DECLARE @DocID nvarchar(30);
drop table DMSResults
CREATE TABLE DMSResults  (DOCID  nvarchar(30) );`
drop table DMSRec

SELECT .....转入DMSRec FROM tbl....

以上语法是用于创建记录集的 Big SQl 脚本。
为了我的运输,我将所有记录插入到新的 tbl 中。
它返回超过 10,00,000 条记录 现在想在tbl DMSREC中循环,读取字段sqltxt的值 执行该语句。

如果它没有返回记录 在 DMSResults 中插入一条记录,其值为 DOCID 字段。

我也尝试了以下命令,但不知道如何在 sql 中循环进行下一个记录,直到 eof 并退出

由于 DMSRec 是一个临时表,一旦处理了一行,我们就可以从 DMSRec 中删除记录。

declare @rc as  bigint
Select @rc = Row_Count
From sys.dm_db_partition_stats
Where Object_Name(Object_Id) = 'DMSRec'

WHILE @rc <1 
      BEGIN 
      exec(select sqltxt from dmsrec where row=1)
--          here check record is exist or not then 
--          if it is not exist or returning zero 
--          add record in dmsresult with docid value
--          delete dmsrec where row=1  
--          loop for next 
      END

考虑到数据库 SQL-Server 2008r2 的庞大规模,请指导我任何优化解决方案。

DMSRec TBL 记录集。

DOCID        SQLTXT

A01/17-18     从 TBL_LET 中选择 VRNO,其中 VRNO='A01/17-18'

【问题讨论】:

  • 您的循环没有意义...请问您为什么将语句存储在表中?
  • 基本上我想检查一些不匹配的主&交易记录。为此,我从不同的表中收集一些值并动态创建 sql 语句来检查需要记录。如果没有那些记录(DOCID 的值),则执行此 SQL 后。虽然我不是技术人员,但我已经写过我的记录,我存储了我的运输记录。如果您在不将记录存储到 tbl 的情况下进行引导,则没有问题。如果整个问题令人困惑,请告诉我如何在 sql 中循环并捕获零记录结果。

标签: sql tsql


【解决方案1】:

我无法在这里解决实际问题,但我可以详细说明如何循环所有记录的问题。顺便说一句

--get the row count of the table
declare @rc as  bigint
Select @rc = (select count(*) from DMSRec)

--variables for incrementing rows and storing SQL
declare @i bigint = 1
declare @sql varchar(max)

WHILE @i <= @rc 
BEGIN 
    --get the SQL Statement from the table
    set @sql = (select sqltxt from dmsrec where row=@i)

    --If no value was returned, insert into DSMResults
    if (@sql is null) or (ltrim(rtrim(@sql)) = '')
    begin
        insert into DMSResults 
        select DOCID from dmsrec
    end
    --If a value was returned, execute that statement
    else
    begin
        exec(@sql)
    end
    --increment the row number
    set @i = @i + 1
END

【讨论】:

  • WHILE @nxt &lt; @rc BEGIN set @sql = (select Rec from dmsrec where row=@nxt) exec (@sql ) --with RESULT sets NONE; select @rc_child = @@ROWCOUNT; if @rc_child = 0 begin insert into DMSResults select DOCID from dmsrec where row=@nxt end set @nxt = @nxt + 1 END 我根据我的要求改变,只是我如何隐藏exec的显示结果。我做上面的练习只是为了,如果存储在@sql中的sql是是否返回任何行,所以我使用 exec 命令。
  • 只要去掉打印语句
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
相关资源
最近更新 更多