在以下代码中使用while循环而不是Cursor

时间:2014-01-15 04:50:25

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

下面您将看到一个光标,用于计算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

非常感谢帮助。

1 个答案:

答案 0 :(得分: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