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 :

Affecter une variable avec des données contenant des simple quote


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2023
    Messages : 3
    Par défaut Affecter une variable avec des données contenant des simple quote
    Bonjour,

    Pour monitorer le log shipping j'ai le code suivant (une partie de code)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE @filePath NVARCHAR(500) = 'C:\temp\report_log_shipping.csv'
    Declare @cmd Nvarchar(500)
     
    set @cmd = 'sqlcmd -s, -W -Q "set nocount on; select 
    CASE WHEN DATEDIFF(MINUTE, CONVERT(datetime,STUFF(STUFF(STUFF(STUFF(STUFF(SUBSTRING(last_copied_file, LEN(last_copied_file) - 17, 14),5,0,'-'),8,0,'-'),11,0,' '),14,0,':'),17,0,':'),120),
                     CONVERT(datetime,STUFF(STUFF(STUFF(STUFF(STUFF(SUBSTRING(last_restored_file, LEN(last_restored_file) - 17, 14),5,0,'-'),8,0,'-'),11,0,' '),14,0,':'),17,0,':'),120)) > -60
    	THEN 'Good'
    	ELSE 'Alert'
    	END AS Status,
    primary_server, primary_database, secondary_database, restore_threshold, last_copied_file, last_copied_date, last_restored_file, last_restored_date, last_restored_latency FROM ##log_shipping_info" | findstr /v /c:"-" /b > ' + @filePath + ''
    EXEC master.dbo.xp_cmdshell @cmd
    Mon problème est que pour affecter la variable @cmd j’utilise une simple quote au début et à la fin mais que dans le select il y a des simple quote pour le traitement des dates et donc cela casse la chaine et la variable n'est pas affectée correctement et donc l’exécution ne passe pas.

    Je précise que la requête SELECT fonctionne correctement quand je n'essaye pas de passer par cmdshell.

    Le but de ce code est de générer un fichier .csv qui via un script powershell est transformé en html.

    Le résultat donne ça :
    Nom : Report_ls.png
Affichages : 143
Taille : 91,1 Ko

    Je calcule la différence en minute entre les dates des 2 fichiers last_copies_file et last_restored_file pour mettre à jour un status.

    J'imagine que c'est un problème d'escape pour le simple quote et j'ai essayé plusieurs chose dont ''' (3 quotes) ou \' mais cela ne passe pas.

    Merci pour votre aide.

    Pat

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 999
    Billets dans le blog
    6
    Par défaut
    Il n'y a pas de séquence d'échappement en SQL à la manière dans certains langages hérités du C.... Il suffit juste de dédoubler l'apostrophe...

    Cela fait partie de la norme SQL

    Exemple :
    Et pour un cours sur SQL : https://sqlpro.developpez.com/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2023
    Messages : 3
    Par défaut
    Bonjour,

    Merci pour ce retour, mais j'ai maintenant une autre erreur .

    En doublant les quote ma commande devient :
    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
     
    DECLARE @filePath NVARCHAR(500) = 'C:\temp\report_log_shipping.csv'
    Declare @cmd Nvarchar(2000)
    Declare @cmd2 Nvarchar(2000)
    set @cmd2 = 'set nocount on; select 
    CASE WHEN DATEDIFF(MINUTE, CONVERT(datetime,STUFF(STUFF(STUFF(STUFF(STUFF(SUBSTRING(last_copied_file, LEN(last_copied_file) - 17, 14),5,0,''-''),8,0,''-''),11,0,'' ''),14,0,'':''),17,0,'':''),120),
    CONVERT(datetime,STUFF(STUFF(STUFF(STUFF(STUFF(SUBSTRING(last_restored_file, LEN(last_restored_file) - 17, 14),5,0,''-''),8,0,''-''),11,0,'' ''),14,0,'':''),17,0,'':''),120)) > -60
    THEN ''Good'' ELSE ''Alert'' END AS Status,
    DATEDIFF(MINUTE, CONVERT(datetime,STUFF(STUFF(STUFF(STUFF(STUFF(SUBSTRING(last_copied_file, LEN(last_copied_file) - 17, 14),5,0,''-''),8,0,''-''),11,0,'' ''),14,0,'':''),17,0,'':''),120),
    CONVERT(datetime,STUFF(STUFF(STUFF(STUFF(STUFF(SUBSTRING(last_restored_file, LEN(last_restored_file) - 17, 14),5,0,''-''),8,0,''-''),11,0,'' ''),14,0,'':''),17,0,'':''),120)) as difference_timestamp, 
    primary_server, primary_database, secondary_database, restore_threshold, last_copied_file, last_copied_date, last_restored_file, last_restored_date, last_restored_latency FROM ##log_shipping_info'
     
    set @cmd = 'sqlcmd -s, -W -Q "'+ @cmd2 + '" | findstr /v /c:"-" /b > ' + @filePath + ''
     
    Select @cmd
     
    EXEC master.dbo.xp_cmdshell @cmd
    Select @cmd donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sqlcmd -s, -W -Q "set nocount on; select  CASE WHEN DATEDIFF(MINUTE, CONVERT(datetime,STUFF(STUFF(STUFF(STUFF(STUFF(SUBSTRING(last_copied_file, LEN(last_copied_file) - 17, 14),5,0,'-'),8,0,'-'),11,0,' '),14,0,':'),17,0,':'),120),  CONVERT(datetime,STUFF(STUFF(STUFF(STUFF(STUFF(SUBSTRING(last_restored_file, LEN(last_restored_file) - 17, 14),5,0,'-'),8,0,'-'),11,0,' '),14,0,':'),17,0,':'),120)) > -60  THEN 'Good' ELSE 'Alert' END AS Status, DATEDIFF(MINUTE, CONVERT(datetime,STUFF(STUFF(STUFF(STUFF(STUFF(SUBSTRING(last_copied_file, LEN(last_copied_file) - 17, 14),5,0,'-'),8,0,'-'),11,0,' '),14,0,':'),17,0,':'),120), CONVERT(datetime,STUFF(STUFF(STUFF(STUFF(STUFF(SUBSTRING(last_restored_file, LEN(last_restored_file) - 17, 14),5,0,'-'),8,0,'-'),11,0,' '),14,0,':'),17,0,':'),120)) as difference_timestamp,  primary_server, primary_database, secondary_database, restore_threshold, last_copied_file, last_copied_date, last_restored_file, last_restored_date, last_restored_latency FROM ##log_shipping_info" | findstr /v /c:"-" /b > C:\temp\report_log_shipping.csv
    et à l'execution j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Msg 105, Level 15, State 1, Server MSSQL-SERVER, Line 1
    Unclosed quotation mark after the character string 'set nocount on; select 
    '.
    NULL
    J'ai l'impression qu'à l'exécution il s'arrête juste après le "select" et qu'il attend à trouver une quote.

    Après différents test le problème venait des retours à la ligne dans l'affectation de la variable @cmd2.

    Il me reste à trouver comment écrire la commande sur plusieurs lignes sans générer ce pb afin que le code soit plus lisible.

    Merci pour votre aide.

    Pat

    Le résultat :
    Nom : Report_ls.png
Affichages : 110
Taille : 92,4 Ko

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

Discussions similaires

  1. Somme sur une variable avec des conditions
    Par vicjohns dans le forum SAS Base
    Réponses: 6
    Dernier message: 07/05/2018, 09h10
  2. Réponses: 2
    Dernier message: 01/12/2008, 14h18
  3. Cadrer une variable avec des zéros à gauche
    Par saysay dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 07/08/2008, 11h05
  4. concatener une variable avec des guillemets
    Par 461219 dans le forum VBScript
    Réponses: 3
    Dernier message: 25/02/2008, 16h29
  5. Faire suivre une variable avec des espaces
    Par jonathan34 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 14/02/2008, 20h57

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