2016-02-19 5 views
0

J'essaie d'exécuter une requête dynamique dans une boucle while dans SQL/PDW. Cette requête me donnera les dates max/min ainsi que le nombre distinct de dates d'une table de faits. J'ai besoin d'exécuter ceci pour tous les schémas dans ma base de données (tous les schémas ont la même structure de table). La requête que je suis en train d'exécuter est donnée ci-dessous:Exécuter une requête dynamique dans une boucle dans SQL

DECLARE @intCNT INT 
SET @intCNT = 1 
DECLARE @strSQL1 VARCHAR(1000) 
DECLARE @strSQL2 VARCHAR(1000) 
DECLARE @strSQL3 VARCHAR(100) 


SET @strSQL1 = 'SELECT MAX(FT_DT) AS MAX_DT, 
        MIN(FT_DT) AS MIN_DT, 
        COUNT(DISTINCT FT_DT) AS DT_CNT 
       FROM ' 

SET @strSQL2 = CONCAT('(SELECT TABLE_SCHEMA 
         FROM 
          (SELECT ROW_NUMBER() OVER(ORDER BY TABLE_SCHEMA) AS ROW_NUM, 
           TABLE_SCHEMA 
          FROM INFORMATION_SCHEMA.TABLES 
          WHERE TABLE_NAME = ''FT_TBL'' 
           AND TABLE_SCHEMA LIKE ''F%'')T 
         WHERE ROW_NUM = ',@intCNT,')') 

SET @strSQL3 = '.FT_TBL' 

EXEC (@strSQL1 + @strSQL2 + @strSQL3) 

Quand j'exécute, je reçois l'erreur suivante:

Msg 102, Level 15, State 1, Line 11 
Incorrect syntax near '.'. 

Est-il quelque chose à voir avec la syntaxe? J'aimerais que cela fonctionne sur mon instance PDW. J'ai essayé dans SQL Server aussi, mais obtenir la même erreur

+0

Je ne sais pas ce que vous faites avec la troisième partie, vous avez besoin pour exécuter strSQL2, puis l'ajouter comme nom de table à strSQL1, ce qui rendrait votre requête en sélection * à partir de "nom généré à partir du résultat de la sous-requête". –

+0

Un outil important dans l'utilisation de SQL dynamique est l'instruction PRINT. IMPRIMEZ la ou les chaîne (s) SQL que vous essayez d'exécuter, et les erreurs de syntaxe seront généralement évidentes. –

+0

Ce dont j'ai besoin, c'est de "sélectionner ---- de .FT_TBL" pour tous les schémas. J'ai besoin d'avoir le jeu de résultats complet enregistré dans un tableau à la fin de l'exécution. –

Répondre

0

ce que vous en train d'essayer de Excecute est:

SELECT MAX(FT_DT) AS MAX_DT, 
        MIN(FT_DT) AS MIN_DT, 
        COUNT(DISTINCT FT_DT) AS DT_CNT 
       FROM 
(SELECT TABLE_SCHEMA 
         FROM 
          (SELECT ROW_NUMBER() OVER(ORDER BY TABLE_SCHEMA) AS ROW_NUM, 
           TABLE_SCHEMA 
          FROM INFORMATION_SCHEMA.TABLES 
          WHERE TABLE_NAME = 'FT_TBL' 
           AND TABLE_SCHEMA LIKE 'F%')T 
         WHERE ROW_NUM = 1) 
.FT_TBL 

le .FT_TBL de @ strSQL3 détruire votre requête. il faudrait peut-être

set @strSQL3 = ' FT_TBL' 
+0

Je reçois une erreur d'analyse lorsque j'exécute ce qui précède. –

+0

quelle erreur d'analyse ?, si c'est le '' je l'ai fixé, mais je ne peux pas vraiment le tester –

+0

Merci pour cela. Dois-je utiliser un SQL dynamique ici? Quand j'ai exécuté votre instruction select (sans aucune variable), j'obtiens: Msg 103010, niveau 16, état 1, ligne 1 Erreur d'analyse à la ligne: 14, colonne: 1: Syntaxe incorrecte près de '.'. –

0

Votre code peut être remplacé par un curseur avec la requête suivante pour vous permettre de sélectionner pour chaque schéma

DECLARE @Schema_Name VarChar 

DECLARE MY_CURSOR CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY 
FOR 
SELECT DISTINCT TABLE_SCHEMA 
FROM TABLE_SCHEMA 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME = 'FT_TBL' 
AND TABLE_SCHEMA LIKE 'F%' 

OPEN MY_CURSOR 
FETCH NEXT FROM MY_CURSOR INTO @Schema_Name 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    --Do something with Id here 
    execute CONCAT(CONCAT('SELECT MAX(FT_DT) AS MAX_DT, 
       MIN(FT_DT) AS MIN_DT, 
       COUNT(DISTINCT FT_DT) AS DT_CNT 
      FROM ',@Schema_Name),'FT_TBL') 
    FETCH NEXT FROM MY_CURSOR INTO @Schema_Name 
END 
CLOSE MY_CURSOR 
DEALLOCATE MY_CURSOR 
+0

Merci beaucoup pour votre réponse. Je suis sur un entrepôt de données Parallèle et les curseurs ne sont pas pris en charge :( –

+0

Bien que j'espère que cela peut être utile pour vous, même si seulement comme base pour savoir ce qu'il faut rechercher – jclozano

+0

J'ai trouvé que, en parallèle, vous devez utiliser le table comme une file d'attente au lieu du curseur http://rusanu.com/2010/03/26/using-tables-as-queues/ – jclozano