52 votes

Comment exécuter une requête SQL sans afficher les résultats ?

Est-il possible d'exécuter une requête SQL sans afficher les résultats ?

comme

Select * from Table_Name

après l'exécution de cette requête, le résultat ne doit pas s'afficher dans le serveur SQL.

0voto

user9129053 Points 19

Je suis surpris que la communauté ne puisse pas facilement trouver un cas d'utilisation pour cela. Les grands ensembles de résultats prennent de la mémoire sur le client, ce qui peut devenir un problème si de nombreuses fenêtres SSMS sont actives (il n'est pas inhabituel pour moi d'avoir 2 ou 3 instances de SSMS ouvertes, chacune avec 50 à 70 fenêtres actives). Dans certains cas, comme dans l'exemple de Cyril, SSMS peut manquer de mémoire et être tout simplement incapable de gérer un grand ensemble de résultats. Par exemple, il m'est arrivé de devoir déboguer une procédure stockée renvoyant des centaines de millions de lignes. Il aurait été impossible de l'exécuter dans SSMS sur ma machine de développement sans rejeter les résultats. La procédure était destinée à un paquet SSIS utilisé comme source de données pour le chargement d'une table d'entrepôt de données. Le débogage dans SSMS impliquait d'apporter des modifications non fonctionnelles (de sorte que l'ensemble des résultats ne m'intéressait pas) et d'inspecter les statistiques d'exécution et les plans d'exécution réels de la requête.

-2voto

David Points 19

J'avais besoin d'une procédure pour retourner tous les enregistrements mis à jour par un utilisateur spécifié après un certain temps, en ne montrant que les résultats où des enregistrements existent. Le voici :

-- Written by David Zanke
-- Return all records modified by a specified user on or after a specified date. 

If mod date does not exist, return row anyhow

Set Nocount on 

Declare @UserName varchar(128) = 'zanked'
    , @UpdatedAfterDate Varchar( 30)  = '2016-10-08'
    , @TableName varchar( 128)
    , @ModUser varchar( 128)
    , @ModTime varchar( 128)
    , @sql varchar( 2000 )

-- In a perfect world, left join would be unecessary since every row that captures the last mod user would have last mod date.

-- Unfortunately, I do not work in a perfect world and rows w/ last mod user exist w/o last mod date

Declare UserRows Cursor for Select distinct c1.table_name, c1.column_name, c2.column_name  From INFORMATION_SCHEMA.COLUMNS c1

Left Join INFORMATION_SCHEMA.COLUMNS c2 On c1.Table_Name = c2.Table_Name And c2.Column_name like '%DTTM_RCD_LAST_UPD%'
        Where c1.column_name like '%UPDATED_BY_USER%'

Open UserRows

Fetch UserRows Into  @tablename, @ModUser, @ModTime

While ( @@FETCH_STATUS = 0 )
Begin
    -- capture output from query into a temp table

    Select @sql = 'Select ''' + @TableName + ''' TableName, * Into ##HoldResults From ' + @TableName + ' Where ' + @ModUser + ' = ''' + @userName + ''''
            + Case When @ModTime Is Null Then '' Else   ' And ' + @ModTime + ' >= ''' + @UpdatedAfterDate + '''' End

    Exec ( @sql)

    -- only output where rows exist
    If @@ROWCOUNT > 0
    Begin
        Select * from ##HoldResults
    End
    Drop Table ##HoldResults

    Fetch UserRows Into  @tablename, @ModUser, @ModTime

End
Close UserRows;
Deallocate UserRows

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X