2016-08-04 69 views
1

Ich habe Tabelle mit Namen der Tabellen ...SELECT Name der Tabelle, wenn die Tabelle leer ist

Ich muss nur die Tabellen auswählen, die leer sind.

Dafür habe ich versucht, CURSOR zu schreiben.

DECLARE @Footprint VARCHAR(200) 
DECLARE @query VARCHAR(200) 
DECLARE MY_CURSOR CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY 
FOR 
SELECT '[' + [SchemaName] + '].[FootprintBuildState]' 
FROM [dbo].[vwAgencySchemas] 

OPEN MY_CURSOR 
FETCH NEXT FROM MY_CURSOR INTO @Footprint 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    --CHECK IF Table IS EMPTY (UNCORRECT) 
    SET @query = 'SELECT ' + @Footprint + ' FROM ' + @Footprint + ' WHERE NOT EXISTS (SELECT * FROM ' + @Footprint+ ') ' 
    EXEC (@query) 
    FETCH NEXT FROM MY_CURSOR INTO @Footprint 
END 
CLOSE MY_CURSOR 
DEALLOCATE MY_CURSOR 

Das ist, was ich habe, aber ich kann nicht richtig Abfrage auszuwählen Namen leere Tabelle

ich Fehler

Msg 105, Ebene 15, Status 1, Zeile schreiben 1
Nicht geschlossenes Anführungszeichen nach der Zeichenfolge '_test12345678910111213141'.

Msg 102, Ebene 15, Status 1, Zeile 1
Falsche Syntax in der Nähe von '_test12345678910111213141'.

Antwort

2

dass Cursor Forget - Sie können dies ganz einfach mit nur einem einfachen, einzigen SELECT Aussage - so etwas wie folgt aus:

SELECT 
    t.NAME AS TableName, 
    p.rows AS RowCounts 
FROM 
    sys.tables t 
INNER JOIN  
    sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
INNER JOIN 
    dbo.YourNamesTable tbl ON t.Name = tbl.TableName 
WHERE 
    p.Rows = 0 
GROUP BY 
    t.Name, p.Rows 
ORDER BY 
    t.Name 
+0

@demo: ** warum ** ', DAS?!?! 'sollte nur auf ** aggregierte ** Spalten angewendet werden, die' SUMME', 'COUNT',' AVG' usw. verwenden - keine meiner Spalten verwendet ein Aggregat, also ** nein **, es besteht keine Notwendigkeit für 'HAVING' ... –