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

Développement SQL Server Discussion :

Nom de table automatisé


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Nom de table automatisé
    Bonjour à tous,
    Cela fait un petit moment que je cherche et je n'ai pourtant rien trouvé, je m'en remet donc à vous:

    Je voudrais faire en sorte de générer mon nom de table de manière automatique. En effet, je dois créer une requete attaquant des tables dont leurs noms changent tout les jour. Il serait sous la forme [instance].[dbo].[table] où [table] serait égal à [(chaine de caractères)+(date du jour)+(chaine de caractères)]

    A l'heure actuelle j'ai une requete qui fonctionne tres bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT [JOB_NAME]
          ,[APPLICATION]
          ,[GROUP_NAME]
          ,CONVERT (datetime, [ODATE]) AS DATE
          ,[STATUS]
    FROM [aaa].[dbo].[A090625001_AJOB]
    WHERE CONVERT (char(6), [ODATE], 12) = (CONVERT (char(6), GETDATE(), 12)-1) 
    AND [STATUS] = 'Ended Not OK'
    AND [APPLICATION] != 'TEST'
    AND [GROUP_NAME] != 'TEST'
    J'ai le résultat attendu

    J'ai donc remplacé mon [A090625001_AJOB] par 'A'+CONVERT(char(6), GETDATE(), 12)+'001_AJOB'. (Testé, cette synthaxe me donne bien A090625001_AJOB)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT [JOB_NAME]
          ,[APPLICATION]
          ,[GROUP_NAME]
          ,CONVERT (datetime, [ODATE]) AS DATE
          ,[STATUS]
    FROM [em630].[dbo].'A'+CONVERT(char(6), GETDATE(), 12)+'001_AJOB'
    WHERE CONVERT (char(6), [ODATE], 12) = (CONVERT (char(6), GETDATE(), 12)-1) 
    AND [STATUS] = 'Ended Not OK'
    AND [APPLICATION] != 'TEST'
    AND [GROUP_NAME] != 'TEST'
    Je récupère l'erreur suivante:Msg 102, Level 15, State 1, Line 6. Incorrect syntax near 'A'.

    Quelqu'un pourrait-il m'aider?

    De plus, je dois faire la meme requete sur la table en j-1 (A090624001_AJOB).
    Problème, lorsque j'execute une requete simple du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select 'A'+(CONVERT(char(6), GETDATE(), 12)-1)+'001_AJOB' AS test from [aaa].[dbo].[A090625001_AJOB]
    j'ai l'erreur suivante:Msg 245, Level 16, State 1, Line 1
    Conversion failed when converting the varchar value 'A' to data type int.

    Par avance, merci
    Chris

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Pour faire ce genre de choses, vous devez utiliser du code SQL dynamique :

    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
    ALTER PROCEDURE sp_SELECT_FROM_TABLE_DONT_LE_NOM_CHANGE
    AS
    BEGIN
    	DECLARE @SQL NVARCHAR(512),
    			@dateDuJour NCHAR(6)
     
    	SELECT @dateDuJour = CONVERT(NCHAR(6), GETDATE(), 12),
    			@SQL = 'SELECT [JOB_NAME]
    				,[APPLICATION]
    				,[GROUP_NAME]
    				,CONVERT (datetime, [ODATE]) AS DATE
    				,[STATUS]
    	FROM [aaa].[dbo].[A' + @dateDuJour + '001_AJOB]
    	WHERE CONVERT (char(6), [ODATE], 12) = (CONVERT (char(6), GETDATE(), 12)-1) 
    	AND [STATUS] = ''Ended Not OK''
    	AND [APPLICATION] <> ''TEST''
    	AND [GROUP_NAME] <> ''TEST'''
     
    	-- PRINT @SQL
     
    	EXEC(@SQL)
    END
    Pour mieux utiliser les statistiques ou les indexes sur la colonne ODATE, nous devrions plutôt écrire :

    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
    ALTER PROCEDURE sp_SELECT_FROM_TABLE_DONT_LE_NOM_CHANGE
    	@
    AS
    BEGIN
    	DECLARE @SQL NVARCHAR(512),
    			@dateDuJour NCHAR(6)
     
    	SELECT @dateDuJour = CONVERT(NCHAR(6), GETDATE(), 12),
    			@SQL = 'SELECT [JOB_NAME]
    				,[APPLICATION]
    				,[GROUP_NAME]
    				,CONVERT (datetime, [ODATE]) AS DATE
    				,[STATUS]
    	FROM [ELSUKET].[dbo].[A' + @dateDuJour + '001_AJOB]
    	WHERE [ODATE] >= CONVERT(VARCHAR, GETDATE() - 1, 112)
    	AND [STATUS] = ''Ended Not OK''
    	AND [APPLICATION] <> ''TEST''
    	AND [GROUP_NAME] <> ''TEST'''
     
    	PRINT @SQL
     
    	EXEC(@SQL)
    END
    En effet le moteur de base de données maintient bien des statistiques sur la colonne ODATE, et peut-être aussi que vous avez indexé cette colonne, donc seules les valeurs de cette colonne sont dans l'index, mais pas CONVERT (char(6), [ODATE], 12)
    Comme je ne suis pas sûr que ODATE soit de type DATETIME ou SMALLDATETIME, je vous laisse en juger.

    Si vous avez besoin de plus de puissance au niveau des valeurs des paramètres de filtrage, vous pouvez utiliser la procédure stocker sp_executeSQL :

    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
    ALTER PROCEDURE sp_SELECT_FROM_TABLE_DONT_LE_NOM_CHANGE
    	@status NVARCHAR(20),
    	@application_DifferentDe NVARCHAR(20),
    	@group_name_DifferentDe NVARCHAR(20)
    AS
    BEGIN
    	DECLARE @SQL NVARCHAR(512),
    			@parametres NVARCHAR(128),
    			@dateDuJour NCHAR(6)
     
    	SELECT @dateDuJour = CONVERT(NCHAR(6), GETDATE(), 12),
    			@parametres = N'@statusIN NVARCHAR(20), @application_DifferentDeIN NVARCHAR(20), @group_name_DifferentDeIN NVARCHAR(20)',
    			@SQL = N'SELECT [JOB_NAME]
    				,[APPLICATION]
    				,[GROUP_NAME]
    				,CONVERT (datetime, [ODATE]) AS DATE
    				,[STATUS]
    	FROM [aaa].[dbo].[A' + @dateDuJour + '001_AJOB]
    	WHERE [ODATE] >= CONVERT(VARCHAR, GETDATE() - 1, 112)
    	AND [STATUS] = QUOTENAME(@statusIN, '''')' +
    	' AND [APPLICATION] <> QUOTENAME(@application_DifferentDeIN, '')' + 
    	' AND [GROUP_NAME] <> QUOTENAME(@group_name_DifferentDeIN, '')'
     
    	EXEC sp_executeSQL
    			@SQL,
    			@parametres,
    			@status,
    			@application_DifferentDe,
    			@group_name_DifferentDe
    END
    L'avantage d'utiliser sp_executeSQL est que vous pouvez lui passer des paramètres, et que les plans de requête qui seront compilés seront paramétrés, donc ce sera plus performant si vous devez exécuter cette requête un grand nombre de fois avec des valeurs qui varient, même peu.

    Poussons le bouchon au delà des bornes des limites : vous pourriez créer une vue tous les matins à partir d'un job avec du code SQL dynamique.
    Cette vue aurait donc un nom qui ne changerait jamais, et la requête que vous pourriez exprimer vos requêtes plus naturellement.
    Si de plus vous avez le moyen d'indexer cette vue, c'est à dire que vous devez avoir un clé unique dans la requête qui la spécifie, vous obtiendriez des performances encore meilleures :

    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
    CREATE PROCEDURE sp_Recree_VZeVue
    AS
    BEGIN
    	DECLARE @SQL NVARCHAR(256),
    			@params NVARCHAR(64)
     
    	SELECT @SQL = N'IF EXISTS(SELECT * FROM aaa.sys.views WHERE name = QUOTENAME(@nameIN, ''''))' +
    					' SET @existeOUT = 1 ELSE SET @existeOUT = 0',
    			@params = N'@nameIN SYSNAME, @existeOUT BIT OUTPUT'
     
    	DECLARE @existe BIT
    	EXEC sp_executeSQL
    		@SQL,
    		@params,
    		@nameIN = 'VZeVue',
    		@existeOUT = @existe OUTPUT
     
    	IF @existe = 1
    	BEGIN
    		DROP VIEW dbo.VZeVue
    	END
     
    	DECLARE @dateDuJour CHAR(6)
    	SELECT @dateDuJour = CONVERT(NCHAR(6), GETDATE(), 12)
     
    	SET @SQL = 'CREATE VIEW VZeVue WITH SCHEMABINDING AS' +
    				' SELECT JOB_NAME,
    						APPLICATION, 
    						GROUP_NAME,
    						ODATE
    						STATUS
    				FROM aaa.dbo.A' + @dateDuJour + '001_AJOB
    				WHERE ODATE >= CONVERT(VARCHAR, GETDATE() - 1, 112)'
     
    	EXEC(@SQL)
     
    	-- Eventuellement pour indexer la vue
    	/*
    	CREATE UNIQUE CLUSTERED INDEX IXC_VZeVue_ColonnesConstituantUnTupleUnique
    	ON aaa.dbo.VZeVue(ColonnesConstituantUnTupleUnique)
    	*/
    END
    Cela étant placé dans un job que vous exécutez tous les matins, vous pouvez ensuite écrire, naturellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT JOB_NAME,
    		APPLICATION,
    		GROUP_NAME,
    		ODATE,
    		STATUS
    FROM dbo.VZeVue
    WHERE STATUS = 'Ended Not OK'
    AND APPLICATION <> 'TEST'
    AND GROUP_NAME <> 'TEST'
    Et l'utiliser dans autre module SQL (procédure stockée, ...)

    @++

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci de cette réponse tres complète.
    Je test ça dans la journée et vous tiens au courant.

  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Ca fonctionne niquel,

    Merci beaucoup

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Ok, pour quelle solution avez-vous opté ?

    @++

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

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Réponses: 2
    Dernier message: 03/02/2005, 13h21
  3. Comment je peux changer nom de 'Table' avec la phrase sql
    Par YEK dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/10/2004, 08h38
  4. Afficher noms des tables d'une base
    Par jeff37 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/01/2004, 16h00
  5. noms des tables d'une base
    Par molto dans le forum SQL
    Réponses: 2
    Dernier message: 17/03/2003, 22h14

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