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 :

Paramétrer le nom d'une table sur une requête


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 104
    Points : 32
    Points
    32
    Par défaut Paramétrer le nom d'une table sur une requête
    Bonjour,

    J'ai une table_1 dans la quelle j'ai une colonne appelée "col_tables" qui contient les noms de quelques tables de ma base (par exemple : table_10, table_11..).!

    Je veux bien dynamiser une requête comme ça :

    Je récupère le nom d'une table de "table_1" comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    declare @table as varchar(100)
    select @table col_tables from table_1 where ....
    Jusqu'à là pas de problèmes, j'obtiens @table = table_10

    Je veux connaitre le nombre d'enregistrement sur "table_10" mais ceci ne marche pas!?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from @table
    Je prie votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Il faut utiliser du SQL dynamique : allez voir ce sujet, entre autre : http://www.developpez.net/forums/d13...ipt-dynamique/

  3. #3
    Membre averti
    Avatar de taibag
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2013
    Messages : 214
    Points : 357
    Points
    357
    Billets dans le blog
    1
    Par défaut
    Hello,
    voici un exemple pour débuter :


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECLARE @tablename varchar(50) 
     
    SET @tablename = 'votretable' 
     
    DECLARE @sqlquery varchar(500)
     
    SET @sqlquery = 'SELECT COUNT(*) FROM' + @tablename 
     
    EXEC (@sqlquery )
    मैं एक छात्र हूँ |

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 104
    Points : 32
    Points
    32
    Par défaut
    Je vous remercie infiniment...

    Je suis encore bloqué sur la question de comment récupérer la valeur de ma requete @var_controle après son exécution moyennant Exec()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     SET @sqlCommand = 'select '+ @var_controle+' = count('+@cle_etrangere2+') from '+ @table_fille2+' where '+ @cle_etrangere2 +' = '+ CAST(@val_cle_prim as varchar(50))
     
    Exec(@sqlCommand)
    quand je fais print @var_controle ça donne rien du tout..!

  5. #5
    Invité
    Invité(e)
    Par défaut
    Tiens inspire-toi de ça

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    -- surveillance des bases de données : donne le nombre d'enregistrements par tables
    CREATE TABLE #TableCount ( table_schema varchar(250), table_name varchar(250), card int,
    	ReservedSize_ko int, DataSize_ko int, IndexSize_ko int, UnusedSize_ko int
    	PRIMARY KEY ( table_schema , table_name ) )
     
    CREATE TABLE #spaceused_tab
    	( tableName varchar(100), numberofRows varchar(100), reservedSize varchar(50), 
    		dataSize varchar(50), indexSize varchar(50), unusedSize varchar(50) )
     
    declare @sql2 nvarchar(1500)
    declare @table_schema varchar(255)
    declare @table_name varchar(255)
     
    DECLARE db_cursor CURSOR FOR 
    	select 
    		REQ2 = 'INSERT  #spaceused_tab EXEC sp_spaceused ''' + QUOTENAME(table_schema) + '.' + QUOTENAME(table_name) + ''''
    		, table_schema
    		, table_name
    	from information_schema.tables 
    	where table_type = 'BASE TABLE'
    		--and TABLE_NAME = 'archive_fix_charges'
    	FOR READ ONLY
     
    OPEN db_cursor 
    FETCH NEXT FROM db_cursor INTO @sql2, @table_schema, @table_name
     
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    	TRUNCATE table #spaceused_tab	
    	exec sp_executesql @sql2
     
    	insert #TableCount
    	select @table_schema, @table_name , 
    		numberofRows, 
    		reverse( substring( reverse( reservedSize ) , 4 , 999)),
    		reverse( substring( reverse( dataSize ) , 4 , 999)),
    		reverse( substring( reverse( indexSize ) , 4 , 999)),
    		reverse( substring( reverse( unusedSize ) , 4 , 999))
    	from #spaceused_tab
     
    	FETCH NEXT FROM db_cursor INTO @sql2, @table_schema, @table_name
    END 
    CLOSE db_cursor 
    DEALLOCATE db_cursor
     
    ; WITH SR_col as (
    	select COL.TABLE_CATALOG, COL.TABLE_SCHEMA, COL.TABLE_NAME, COUNT(*) nb_colonnes
    	from INFORMATION_SCHEMA.COLUMNS COL with (nolock)
    	group by COL.TABLE_CATALOG, COL.TABLE_SCHEMA, COL.TABLE_NAME
    ) , SR_Ind AS (
    	select OBJECT_NAME(IND.object_id) name
    		, OBJECT_SCHEMA_NAME(IND.object_id) schema_name
    		, IND.object_id, COUNT(*) nb_indexes
    	from SYS.indexes IND with (nolock)
    	where IND.index_id > 0
    	group by IND.object_id
    )
    SELECT TAB.TABLE_CATALOG, TAB.TABLE_SCHEMA, TAB.TABLE_NAME
    	, max(SR_col.nb_colonnes) nb_colonnes
    	, MAX(case when SR_ind.nb_indexes is null then 0 else SR_ind.nb_indexes end) nb_indexes
    	, sum(case when CNT.CONSTRAINT_TYPE = 'PRIMARY KEY' then 1 else 0 end) PK
    	, sum(case when CNT.CONSTRAINT_TYPE = 'UNIQUE' then 1 else 0 end) UK
    	, sum(case when CNT.CONSTRAINT_TYPE = 'FOREIGN KEY' then 1 else 0 end) FK
    	, sum(case when CNT.CONSTRAINT_TYPE = 'CHECK' then 1 else 0 end) CHK
    	, max(TBC.card) nb_lignes
    	, cast(max(TBC.ReservedSize_ko)/1024. as decimal(12,3)) ReservedSize_Mo
    	, cast(max(TBC.DataSize_ko)/1024. as decimal(12,3)) DataSize_Mo
    	, cast(max(TBC.IndexSize_ko)/1024. as decimal(12,3)) IndexSize_Mo
    	, cast(max(TBC.UnusedSize_ko)/1024. as decimal(12,3)) UnusedSize_Mo
    FROM information_schema.tables TAB with (nolock)
    left outer join INFORMATION_SCHEMA.TABLE_CONSTRAINTS CNT with (nolock)
    	on CNT.CONSTRAINT_CATALOG = TAB.TABLE_CATALOG
    		and CNT.CONSTRAINT_SCHEMA = TAB.TABLE_SCHEMA
    		and CNT.TABLE_NAME = TAB.TABLE_NAME
    LEFT OUTER JOIN SR_col with (nolock)
    	on SR_col.TABLE_CATALOG = TAB.TABLE_CATALOG
    		and SR_col.TABLE_SCHEMA = TAB.TABLE_SCHEMA
    		and SR_col.TABLE_NAME = TAB.TABLE_NAME
    LEFT OUTER JOIN SR_Ind with (nolock)
    	ON SR_Ind.schema_name = TAB.TABLE_SCHEMA
    		and SR_Ind.name = TAB.TABLE_NAME
    left outer join #TableCount TBC  with (nolock)--order by card desc , table_schema , table_name
    	on TBC.table_schema = TAB.TABLE_SCHEMA COLLATE database_default
    		and TBC.table_name = TAB.TABLE_NAME COLLATE database_default
    WHERE TAB.table_type='BASE TABLE'
    	and TAB.TABLE_NAME not in ( 'dtproperties' , 'sysdiagrams' )
    group by TAB.TABLE_CATALOG, TAB.TABLE_SCHEMA, TAB.TABLE_NAME
    order by ReservedSize_Mo desc, TAB.TABLE_CATALOG, TAB.TABLE_SCHEMA, TAB.TABLE_NAME
     
    drop TABLE #TableCount 
    drop TABLE #spaceused_tab

  6. #6
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    La méthode la plus simple et la plus appropriée pour récupérer une valeur en sortie, en SQL Dynamique; est d'utiliser la construction EXECUTE sp_executesql et la clause OUTPUT

    Ci-dessous un exemple simple qui explique la mise en œuvre de cette technique.

    Code SQL : 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
    DECLARE @SQLString NVARCHAR(500);
    DECLARE @ParmDefinition NVARCHAR(500);
     
    DECLARE @IntVariable INT;     
    DECLARE @max_title VARCHAR(30);
     
    SET @IntVariable = 197;
    SET @SQLString = N'SELECT @max_titleOUT = max(Title)
       FROM AdventureWorks.HumanResources.Employee
       WHERE ManagerID = @level';
    SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';
     
    EXECUTE sp_executesql @SQLString,            -- (1)  
                          @ParmDefinition,       -- (2) 
                          @level = @IntVariable, -- (3)         
                          @max_titleOUT = @max_title OUTPUT; -- (4) 
    SELECT @max_title; -- (5)
    Notes de renvoi :

    (1) Chaine contenant la requête construite dynamiquement et intégrant des paramètres.
    (2) Chaine contenant la déclaration des paramètres (IN et OUT) de la requête dynamique. Ne pas oublier la clause OUTPUT pour le(s) paramètre(s) de sortie (exemple : @max_titleOUT varchar(30) OUTPUT).
    (3) Affectation du paramètre @level par la valeur de la variable externe @IntVariable
    (4) Récupération du résultat dans la variable externe @max_title en utilisant la clause OUTPUT à ne pas oublier.
    (5) Affichage du résultat, une fois récupéré dans la variable @max_title

    Autres remarques :

    - Les paramètres internes à la requête dynamique @level et @max_titleOUT ne sont pas visibles, et ne sont pas accessibles, dans le bloc T-SQL, après l'exécution de la requête (ni même avant). C’est la variable externe, déjà déclarée @max_title, et mappée au moment de l’appel au paramètre interne à la requête dynamique @max_titleOUT, qui permet de récupérer le résultat.
    - sp_executesql, contrairement à EXEC(@SQl), préserve un peu (mais pas complètement) de l'Injection SQL.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

Discussions similaires

  1. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  2. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  3. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29
  4. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50

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