05.06.2018

APS & PDW: Top 1000 Queries via Prozedur erzeugen

Technical Value

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:

Select Top 1000 Menü

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“:

Select top 1000 SSDT

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:

  1. -- Drop procedure if exists
  2. IF object_id(N'dbo.GetSelect',N'P') IS NOT NULL
  3.   DROP PROC dbo.GetSelect;
  4. GO
  5.  
  6. -- Create procedure
  7. CREATE PROC [dbo].[GetSelect] @Schema [nvarchar](255),@Table [nvarchar](255) AS
  8.   BEGIN
  9.    
  10.   DECLARE @Column nvarchar(255) = ''
  11.   DECLARE @Select nvarchar(2000) = ''
  12.  
  13.   -- Check if the object exists
  14.   IF object_id(@Schema + '.' + @Table,N'U') IS NOT NULL OR object_id(@Schema + '.' + @Table,N'V') IS NOT NULL
  15.     BEGIN
  16.    
  17.         -- Check if the temp-table exists
  18.     IF object_id(N'tempdb..#ColumnTable') IS NOT NULL
  19.       DROP TABLE #ColumnTable;
  20.     ELSE
  21.       BEGIN
  22.             -- Create temp table as 'cursor replacement' (PDW/APS do not support cursor)
  23.         CREATE TABLE #ColumnTable
  24.         WITH (DISTRIBUTION = REPLICATE)
  25.         AS
  26.           SELECT row_number() over (order by ordinal_position) AS ID
  27.                          ,column_name AS Name
  28.           FROM   information_schema.columns
  29.           WHERE  table_schema = @Schema
  30.                  AND table_name = @Table
  31.        
  32.                 -- Declare and set necessary variables
  33.         DECLARE  @Counter int = 1
  34.         DECLARE  @MaxID int = (SELECT MAX(ID) FROM #ColumnTable)
  35.         DECLARE  @CurrentColumn nvarchar(255) = ''
  36.        
  37.                 -- Loop trough created temp table and build string
  38.         WHILE @Counter <= @MaxID
  39.         BEGIN
  40.           SET @CurrentColumn = (SELECT Name FROM #ColumnTable WHERE ID = @Counter)
  41.           SET @Select = @Select + ',[' + @CurrentColumn + ']' + CHAR(10)
  42.           SET @Counter = @Counter + 1
  43.         END
  44.  
  45.                 -- Drop temp table
  46.         DROP TABLE #ColumnTable
  47.       END
  48.      
  49.           -- Delete last comma and complete string with 'select ... from ...'
  50.       SET @Select = RIGHT(@Select,LEN(@Select)-1)
  51.       SET @Select = N'SELECT TOP 1000' + CHAR(10) + @Select
  52.       SET @Select = @Select + N'FROM [' + @Schema + N'].[' + @Table + N']'    
  53.       END
  54.     ELSE
  55.       SET @Select = N'Table or view [' + @Schema + N'].[' + @Table  + N'] not found'
  56.  
  57.   -- Get string
  58.   SELECT @Select
  59. END

Mit dem folgenden, kurzen SQL-Aufruf wird dann das gewohnte Select-Top-1000-Statement zurückgegeben:

  1. exec getselect 'dbo','TestTable'

Select Top 1000 Result

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:

Select Top 1000 Query

Neuen Kommentar schreiben

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.

Klartext

  • Keine HTML-Tags erlaubt.
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.
  • Web page addresses and email addresses turn into links automatically.
Teilen auf

Newsletter Anmeldung

Abonnieren Sie unseren Newsletter!
Lassen Sie sich regelmäßig über alle Neuigkeiten rundum ORAYLIS und die BI- & Big-Data-Branche informieren.

Jetzt anmelden