APS & PDW: Top 1000 Queries via Prozedur erzeugen
Wie ihr vielleicht auch schon festgestellt habt, ist das Parallel Data Warehouse (PDW) nicht richtig kompatibel mit dem SQL Server Management Studio (SSMS) und den SQL Server Data Tools (SSDT). In beiden Fällen könnt ihr bei der Entwicklung auf die meisten Funktionen nicht zugreifen. Gleiches gilt für den PDW-Nachfolger, das Analytics Platform System. Eine Lösung bieten bislang lediglich kostenpflichtige Tools von Fremdherstellern.
Daher habe ich im Rahmen eines Kundenprojektes eine Prozedur geschrieben, durch die sich zumindest die häufig genutzten „Select Top 1000 Rows“ auch über das PDW erzeugen lassen. Jene möchte ich euch im Folgenden vorstellen.
Mangelnde Kompatibilität beim PDW
Normalerweise könnt ihr mit dem SSMS über einen Rechtsklick auf die gewünschte Tabelle das Select-Top-1000-Statement ausführen lassen:
Daraufhin wird die komplette Tabellenstruktur ausgegeben. Die Abfrage lässt sich dann nach Belieben umbauen. In Verbindung mit einem PDW steht diese Funktion jedoch nicht zur Verfügung. Infolgedessen müssen alle Select-Spalten einer Tabelle vom Entwickler selbst geschrieben werden. Je nach Anzahl der Tabellenspalten kann dies einen enormen Arbeitsaufwand bedeuten.
Zwar lässt sich das PDW im SSMS über „Registered Server“ einbinden. Allerdings gibt es keine Sicht auf die Datenbankobjekte und damit auch nicht die gewohnten Funktionalitäten. Währenddessen bieten die SSDT für das PDW zumindest die Funktion des „View Codes“:
Hier wird dann das Create-Table-Statement der jeweiligen Tabelle zurückgeliefert. Ein adäquater Ersatz ist das aber auch nicht. Letztlich blieb uns im konkreten Projekt gar nichts anderes übrig, als nach einer eigenen Lösung zu suchen, die die Aufwände im Rahmen hielt.
Prozedur für Top-1000-Queries
Die von mir entwickelte Prozedur liefert euch nun das gewohnte Select-Top-1000-Statement als String. Ihr müsst dabei auf eine temporäre Tabelle zurückgreifen, da das PDW weder Cursor noch FOR XML unterstützt. Die Prozedur erwartet als Übergabeparameter das Tabellenschema und den Tabellennamen:
- -- Drop procedure if exists
- IF object_id(N'dbo.GetSelect',N'P') IS NOT NULL
- DROP PROC dbo.GetSelect;
- GO
- -- Create procedure
- CREATE PROC [dbo].[GetSelect] @Schema [nvarchar](255),@Table [nvarchar](255) AS
- BEGIN
- DECLARE @Column nvarchar(255) = ''
- DECLARE @Select nvarchar(2000) = ''
- -- Check if the object exists
- IF object_id(@Schema + '.' + @Table,N'U') IS NOT NULL OR object_id(@Schema + '.' + @Table,N'V') IS NOT NULL
- BEGIN
- -- Check if the temp-table exists
- IF object_id(N'tempdb..#ColumnTable') IS NOT NULL
- DROP TABLE #ColumnTable;
- ELSE
- BEGIN
- -- Create temp table as 'cursor replacement' (PDW/APS do not support cursor)
- CREATE TABLE #ColumnTable
- WITH (DISTRIBUTION = REPLICATE)
- AS
- SELECT row_number() over (order by ordinal_position) AS ID
- ,column_name AS Name
- FROM information_schema.columns
- WHERE table_schema = @Schema
- AND table_name = @Table
- -- Declare and set necessary variables
- DECLARE @Counter int = 1
- DECLARE @MaxID int = (SELECT MAX(ID) FROM #ColumnTable)
- DECLARE @CurrentColumn nvarchar(255) = ''
- -- Loop trough created temp table and build string
- WHILE @Counter <= @MaxID
- BEGIN
- SET @CurrentColumn = (SELECT Name FROM #ColumnTable WHERE ID = @Counter)
- SET @Select = @Select + ',[' + @CurrentColumn + ']' + CHAR(10)
- SET @Counter = @Counter + 1
- END
- -- Drop temp table
- DROP TABLE #ColumnTable
- END
- -- Delete last comma and complete string with 'select ... from ...'
- SET @Select = RIGHT(@Select,LEN(@Select)-1)
- SET @Select = N'SELECT TOP 1000' + CHAR(10) + @Select
- SET @Select = @Select + N'FROM [' + @Schema + N'].[' + @Table + N']'
- END
- ELSE
- SET @Select = N'Table or view [' + @Schema + N'].[' + @Table + N'] not found'
- -- Get string
- SELECT @Select
- END
Mit dem folgenden, kurzen SQL-Aufruf wird dann das gewohnte Select-Top-1000-Statement zurückgegeben:
- exec getselect 'dbo','TestTable'
Das Ergebnis könnt ihr schließlich in das Abfrage-Fenster kopieren und an eure Anforderungen anpassen. Hierbei wird unter anderem nach jeder Tabellenspalte ein Zeilenumbruch vorgenommen:
Neuen Kommentar schreiben