下面您将看到一个光标,用于计算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
非常感谢帮助。
答案 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