【问题标题】:Use while loop instead of Cursor in the following code在以下代码中使用 while 循环而不是 Cursor
【发布时间】:2014-02-03 10:40:06
【问题描述】:

您将在下面看到一个游标,用于计算 AdventureWorks2012 的每个表中的行数。现在,我正在尝试使用 WHILE LOOP 来获得相同的结果。但是,我遇到了麻烦,谁能帮帮我。

DECLARE @table sysname
DECLARE @SCHEMA SYSNAME
DECLARE @COUNT INT
DECLARE @STR VARCHAR(200)

CREATE TABLE #REC(COUNT INT)
CREATE TABLE #REC1(SCHEMA_NAME VARCHAR(100),TABLE_NAME VARCHAR(100), COUNT INT)

DECLARE TableCursor CURSOR LOCAL FAST_FORWARD FOR 

SELECT table_schema, table_name
FROM AdventureWorks2012.[INFORMATION_SCHEMA].[TABLES]
WHERE TABLE_TYPE ='BASE TABLE'
ORDER BY table_schema

OPEN TableCursor FETCH NEXT FROM TableCursor INTO @SCHEMA, @table;

WHILE (@@FETCH_STATUS = 0) 
  BEGIN
    SET @STR='SELECT COUNT (*) FROM AdventureWorks2012.'+@SCHEMA+'.'+@table;

    INSERT INTO #REC
    EXEC(@STR)

    SELECT @COUNT=COUNT FROM #REC
    PRINT @COUNT

    INSERT INTO #REC1 VALUES(@SCHEMA,@table,@COUNT)

    FETCH  NEXT FROM TableCursor INTO @SCHEMA, @table;
END 

CLOSE TableCursor; 
DEALLOCATE TableCursor; 

SELECT * FROM #REC1

DROP TABLE #REC
DROP TABLE #REC1

非常感谢您的帮助。

【问题讨论】:

    标签: sql while-loop cursor sql-server-2012


    【解决方案1】:

    尝试运行以下脚本,从数据库中检索所有表以及每个表的行数。

    USE AdventureWorks2012
    
    SELECT sc.name +'.'+ ta.name TableName
    ,SUM(pa.rows) RowCnt
    FROM sys.tables ta
    INNER JOIN sys.partitions pa
    ON pa.OBJECT_ID = ta.OBJECT_ID
    INNER JOIN sys.schemas sc
    ON ta.schema_id = sc.schema_id
    WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
    GROUP BY sc.name,ta.name
    ORDER BY SUM(pa.rows) DESC
    

    希望这能回答您的问题。

    DECLARE @tableName1 sysname
    
    DECLARE @SCHEMANAME1 SYSNAME
    
    DECLARE @COUNT1 INT
    
    DECLARE @STR1 VARCHAR(200)
    
    CREATE TABLE #Wltable(COUNT INT)
    
    CREATE TABLE #Wltable1(SCHEMA_NAME VARCHAR(100),TABLE_NAME VARCHAR(100), COUNT INT)
    
    INSERT INTO #Wltable
    SELECT table_schema, table_name
    
    FROM AdventureWorks2012.[INFORMATION_SCHEMA].[TABLES]
    
    WHERE TABLE_TYPE ='BASE TABLE'
    
    ORDER BY table_schema
    
    WHILE (SELECT @SCHEMANAME1=SCHEMA_NAME, @tablename1=Table_Name FROM #Wltable1)
    BEGIN
    
        SELECT COUNT (*) FROM AdventureWorks2012.+@SCHEMANAME1+@tableName1;
    
        SET @STR1=@str1+1
    
    END 
    

    这是我目前的立场,似乎无法让它发挥作用。

    我已经更新了我的脚本,现在它将返回与光标查询相同的结果集。

    SELECT  sc.name AS [SCHEMA_NAME], ta.name AS [TABLE_NAME]
    ,SUM(pa.rows) AS [COUNT]
    FROM sys.tables ta
    INNER JOIN sys.partitions pa
    ON pa.OBJECT_ID = ta.OBJECT_ID
    INNER JOIN sys.schemas sc
    ON ta.schema_id = sc.schema_id
    WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
    GROUP BY sc.name,ta.name
    ORDER BY SUM(pa.rows) DESC
    

    【讨论】:

    • 你能用while循环来做到这一点吗?
    • 我认为最好将此结果存储在一些临时表中并使用它,而不是使用while循环。
    • 我确实有两个临时表创建 #Wltable 和 #Wltable1 用于显示我的最终结果
    • 您的要求是什么。您希望如何处理来自 tablenames 及其行数的结果。
    • 我想获得与使用游标时相同的结果,但这次使用 while 循环。这可能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多