IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

SP_MSforeachdb taille de variable [2012]


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Avatar de SQL_EVAN
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2011
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 161
    Points : 245
    Points
    245
    Par défaut SP_MSforeachdb taille de variable
    Bonjour tous,

    J'ai besoin de vos lumières

    Je suis en train de créer une requête qui fait des contrôles de nommage de table sur chaque base de données. Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    IF DB_NAME() LIKE 'Source%'
    BEGIN
    SELECT
    	CASE
    		WHEN TABLE_NAME LIKE 'zzz%' THEN 'A supprimer'
    		WHEN TABLE_NAME LIKE 'TD_%' THEN 'Table de dimension'
    		WHEN TABLE_NAME LIKE 'TF_%' THEN 'Table de faits'
    		WHEN TABLE_NAME LIKE 'CDE_%' THEN 'Tables d’enrichissement ' ELSE 'Pas de règles de nommage pour les bases Source_%'
    	END AS TABLE_TYPE,
    	DB_NAME() AS DATABASE_NAME,
    	TABLE_NAME,
    	CASE
    		WHEN TABLE_NAME LIKE 'zzz%' THEN 1 ELSE 0
    	END AS CONTROL_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE'
    END
    IF DB_NAME() LIKE 'Prochain type de base....'
    BEGIN
    Requête
    END
    etc. etc.
    Ma requête marche nickel quand je la lance avec un USE XXX GO dans SSMS.

    Cependant je veux industrialiser ce truc en utilisant la procédure stockée master.sys.SP_MSforeachDB et passer ma requête en tant que variable pour le SQL dynamique.

    Seul souci : le type de données de variable pour la procédure stockée et limité (NVARCHAR(4000)) je pense. Et ma requête fait plus de 5000

    J'ai tenté de recréer la PS avec des variables NVARCHAR(MAX) mais ça marche pas puisqu'il appelle d'autres PS de façon imbriquée....

    Any ideas?!

  2. #2
    Membre actif
    Avatar de SQL_EVAN
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2011
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 161
    Points : 245
    Points
    245
    Par défaut
    Ah, j'ai trouvé la réponse.

    Ca marche avec un curseur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    USE master
    GO
     
    CREATE  TABLE #TABLE_TABLE (TABLE_TYPE VARCHAR(255), DATABASE_NAME VARCHAR(255), TABLE_NAME VARCHAR(255), CONTROL_NAME BIT)
     
    DECLARE @DB_NAME NVARCHAR(100)
    DECLARE @QUERY NVARCHAR(MAX)
     
    DECLARE CUR_BASES CURSOR
    FOR SELECT name FROM sys.databases
    WHERE database_id > 4
     
    OPEN CUR_BASES
     
    FETCH NEXT FROM CUR_BASES INTO @DB_NAME
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
     
    IF @DB_NAME LIKE 'DataMart%'
    BEGIN
    SET @QUERY =
     
    '
    INSERT INTO #TABLE_TABLE 
    SELECT
    	CASE
    		WHEN TABLE_NAME LIKE ''zzz%'' THEN ''A supprimer''
    		WHEN TABLE_NAME LIKE ''REPORT%'' THEN ''Table qui sert à alimenter les rapports SSRS''
    		WHEN TABLE_NAME LIKE ''RESTIT%'' THEN ''Table de données utilisées par les vues dans Publication_RESTITS''
    		WHEN TABLE_NAME LIKE ''HISTO%'' THEN ''Table historisation de données des indicateurs'' ELSE ''Non classé !''
    	END AS TABLE_TYPE,
    	''' + @DB_NAME + ''' AS DATABASE_NAME,
    	TABLE_NAME,
    	CASE
    		WHEN TABLE_NAME LIKE ''zzz%'' THEN 1
    		WHEN TABLE_NAME LIKE ''REPORT%'' THEN 0
    		WHEN TABLE_NAME LIKE ''RESTIT%'' THEN 0
    		WHEN TABLE_NAME LIKE ''HISTO%'' THEN 0 ELSE 1
    	END AS CONTROL_NAME
    FROM ' + @DB_NAME + '.INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = ''BASE TABLE''
    '
     
    EXEC sys.sp_executesql @QUERY
    FETCH NEXT FROM CUR_BASES INTO @DB_NAME
    END
    END
     
    CLOSE CUR_BASES
    DEALLOCATE CUR_BASES
     
    SELECT * FROM #TABLE_TABLE
    ORDER BY TABLE_TYPE, TABLE_NAME
     
    DROP TABLE #TABLE_TABLE
    J'ai plusieurs IF @DB_NAME LIKE....

    Usine à gaz ce truc!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Taille de variable
    Par subnox dans le forum VBA Access
    Réponses: 7
    Dernier message: 19/10/2007, 18h04
  2. Taille de variable et taille de code.
    Par proton88 dans le forum C
    Réponses: 8
    Dernier message: 24/04/2007, 11h35
  3. [TP] Comment contourner la limite de taille des variables ?
    Par celinec62 dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 20/04/2007, 21h00
  4. [debutant]Taille de variable et contenu
    Par syl2095 dans le forum Débuter
    Réponses: 13
    Dernier message: 22/05/2006, 11h23
  5. taille des variables ou des objets?
    Par BobLBricoleur dans le forum Flash
    Réponses: 4
    Dernier message: 27/12/2005, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo