2017-07-26 4 views
1

Ich versuche, ein bisschen SQL-Skript zu machen, das alle Tabellennamen in einer großen Datenbank zusammen mit der Anzahl der Felder und Datensätze in jedem und einer Liste der Feldnamen ausgeben wird. Dadurch können wir uns auf die Tabellen mit Daten konzentrieren und nach Feldnamen suchen, die mit verschiedenen Tabellen übereinstimmen, die für Joins geeignet sein können.Ausgabeparameter für sp_executesql deklarieren

Um dies zu tun, versuche ich dynamische SQL schreiben, die durch alle Tabellen durchlaufen kann. Aber ich konnte sp_executesql nicht dazu bringen, Ausgaben zu liefern, die ich in meine Tabellenvariable einfügen kann. Hier ist der Code, den ich geschrieben habe, so weit:

USE MITAS_TEST; 
DECLARE @TablesAbstract TABLE(
    TableName VARCHAR(50), 
    NumberOfFields INT, 
    NumberOfRecords INT 
); 
DECLARE @NumberOfRowsCounted INTEGER; 
SET @NumberOfRowsCounted = 0; 
DECLARE @RecSql NVARCHAR(500); 
SET @RecSql = 'EXECUTE(''SELECT @NumberOfRows = COUNT(*) FROM ''[email protected])'; 
DECLARE @ParmDefinition NVARCHAR(100); 
SET @ParmDefinition = '@TableName NVARCHAR(100), @NumberOfRows INTEGER OUTPUT'; 
DECLARE @TableN NVARCHAR(100); 
SET @TableN = 'MITAS_TEST.dbo.AP500'; 
EXECUTE sp_executesql @RecSql, 
    @ParmDefinition, 
    @TableName = @TableN, 
    @NumberOfRows = @NumberOfRowsCounted OUTPUT; 

ich die folgende Fehlermeldung erhalten:

Msg 137, Level 15, State 1, Line 1
Must declare the scalar variable "@NumberOfRows"

Ich hätte gedacht, es @NumberOfRows im @ParmDefinition Feld zu erklären, genügt (basierend auf dieser Quelle: https://technet.microsoft.com/en-us/library/ms188001(v=sql.90).aspx). Was mache ich falsch? Gibt es einen besseren Weg?

Antwort

0

Die innere ausführen sieht aus wie:

EXECUTE('SELECT @NumberOfRows = COUNT(*) FROM MITA_TEST.dbo.AP500') 

In diesem Zusammenhang ist @NumberOfRows nicht vorhanden. Sie könnten dies in einen anderen Aufruf von sp_executesql ändern und den Ausgabeparameter @NumberOfRows auf einer anderen Ebene weiterleiten.

Angenommen, dass dies Lerncode darstellt, und nicht Produktion. Abhängig von der Quelle von @TableN könnte dies für SQL-Injection-Angriffe suspektabel sein. Siehe quotename in Büchern online.