web-dev-qa-db-fra.com

Rompre une chaîne sur plusieurs lignes

J'ai écrit un script qui se connecte à une base de données Oracle pour sélectionner plusieurs entrées dans une table spécifique.

La déclaration ressemble à ceci:

rs.open "SELECT PATH301 FROM NC301B WHERE EDIPROC like 'P30_' AND (LF301M > 0) AND (PATH301 NOT LIKE '%saptemp%') AND (PATH301 NOT LIKE '%SAPTEMP%') AND (PATH301 NOT LIKE '%usr%') AND (PATH301 NOT LIKE '%Windows%');", cn, 3

Maintenant, je veux savoir s'il est possible de diviser cette déclaration sur plusieurs lignes. Par exemple, comme ceci:

rs.open "SELECT PATH301 FROM NC301B 
WHERE EDIPROC like 'P30_' 
AND (LF301M > 0) 
AND (PATH301 NOT LIKE '%saptemp%') 
AND (PATH301 NOT LIKE '%SAPTEMP%') 
AND (PATH301 NOT LIKE '%usr%') 
AND (PATH301 NOT LIKE '%Windows%');", cn, 3

Cette première déclaration SELECT est trop grosse et pas du tout belle. J'espère que tu comprends ce que je veux dire.

17
rel0aded0ne

Je vais quand même poster une réponse, je n'ai jamais été fan du Fastest Gun in the West Problem

Utilisation du caractère de continuation de ligne

Comme je mentionné dans les commentaires il semble que vous souhaitiez rendre la commande SQL plus lisible dans le code. La manière normale de procéder consiste à utiliser le Caractère de continuation de ligne (_) également connu sous le nom de saut de déclaration .

Dim sql
sql = "SELECT PATH301 " & _
  "FROM NC301B " & _
  "WHERE EDIPROC like 'P30_' " & _
  "AND (LF301M > 0) " & _
  "AND (PATH301 NOT LIKE '%saptemp%') " & _
  "AND (PATH301 NOT LIKE '%SAPTEMP%') " & _
  "AND (PATH301 NOT LIKE '%usr%') " & _
  "AND (PATH301 NOT LIKE '%Windows%');"

Gardez à l'esprit que cela diffère si nous n'avons pas affaire à une chaîne, par exemple, continuer une instruction If sur deux lignes ressemblerait à ceci;

If result = ( _
  condition1 _
  And condition2 _
  And condition3) Then

Parce que nous ne pouvons pas couper une chaîne entre les lignes, nous trichons en terminant la chaîne en continuant la ligne, puis en concaténant la chaîne à la chaîne suivante & _. Cela signifie également que cela fonctionnera;

Dim sql
sql = "SELECT PATH301 " _
  & "FROM NC301B " _
  & "WHERE EDIPROC like 'P30_' " _
  & "AND (LF301M > 0) " _
  & "AND (PATH301 NOT LIKE '%saptemp%') " _
  & "AND (PATH301 NOT LIKE '%SAPTEMP%') " _
  & "AND (PATH301 NOT LIKE '%usr%') " _
  & "AND (PATH301 NOT LIKE '%Windows%');"

Tout dépend de vos préférences personnelles et aucune des deux solutions n'a d'avantage sur ses performances.

Personnellement, bien que je trouve que cette approche est plus problématique que cela en vaut la peine, surtout en ce qui concerne les chaînes SQL.

Utilisation de la concaténation de chaînes

Dites que vous voulez tester sans l'une des conditions disons

AND (PATH301 NOT LIKE '%SAPTEMP%')

essayer de commenter cette ligne va générer un

Erreur de compilation Microsoft VBScript:
Erreur de syntaxe

Voici un exemple;

Dim sql
sql = "SELECT PATH301 " & _
  "FROM NC301B " & _
  "WHERE EDIPROC like 'P30_' " & _
  "AND (LF301M > 0) " & _
  "AND (PATH301 NOT LIKE '%saptemp%') " & _
  '"AND (PATH301 NOT LIKE '%SAPTEMP%') " & _
  "AND (PATH301 NOT LIKE '%usr%') " & _
  "AND (PATH301 NOT LIKE '%Windows%');"

Ce qui le rend très rigide, c'est pourquoi je préfère utiliser String Concatenation pour construire une chaîne, comme ceci;

Dim sql: sql = ""
sql = sql & "SELECT PATH301 "
sql = sql & "FROM NC301B "
sql = sql & "WHERE EDIPROC like 'P30_' "
sql = sql & "AND (LF301M > 0) "
sql = sql & "AND (PATH301 NOT LIKE '%saptemp%') "
sql = sql & "AND (PATH301 NOT LIKE '%SAPTEMP%') "
sql = sql & "AND (PATH301 NOT LIKE '%usr%') "
sql = sql & "AND (PATH301 NOT LIKE '%Windows%');"

Bien qu'un peu de travail supplémentaire, il est beaucoup plus flexible et vous permet de tester des chaînes SQL en commentant les lignes sans affecter la chaîne SQL entière, comme ceci;

Dim sql: sql = ""
sql = sql & "SELECT PATH301 "
sql = sql & "FROM NC301B "
sql = sql & "WHERE EDIPROC like 'P30_' "
sql = sql & "AND (LF301M > 0) "
sql = sql & "AND (PATH301 NOT LIKE '%saptemp%') "
'sql = sql & "AND (PATH301 NOT LIKE '%SAPTEMP%') "
sql = sql & "AND (PATH301 NOT LIKE '%usr%') "
sql = sql & "AND (PATH301 NOT LIKE '%Windows%');"

Une autre petite chose que j'aime faire est de suivre chaque ligne avec & vbNewLine comme ça;

Dim sql: sql = ""
sql = sql & "SELECT PATH301 " & vbNewLine
sql = sql & "FROM NC301B " & vbNewLine
sql = sql & "WHERE EDIPROC like 'P30_' " & vbNewLine
sql = sql & "AND (LF301M > 0) " & vbNewLine
sql = sql & "AND (PATH301 NOT LIKE '%saptemp%') " & vbNewLine
sql = sql & "AND (PATH301 NOT LIKE '%SAPTEMP%') " & vbNewLine
sql = sql & "AND (PATH301 NOT LIKE '%usr%') " & vbNewLine
sql = sql & "AND (PATH301 NOT LIKE '%Windows%');"

De cette façon, lors de la sortie de la chaîne (en utilisant Classic ASP, WScript, etc.) , il formate correctement et lors de l'affichage dans une page HTML (si vous utilisez Classic ASP) vous pouvez facilement utiliser

sql = Replace(sql, vbNewLine, "<br />")

pour le formater correctement, très utile lorsque vous essayez de déboguer des problèmes avec SQL dynamique.

36
Lankymart

L'instruction SQL est une chaîne, vous pouvez donc la diviser en plusieurs chaînes et concaténer les. Utilisez l'opérateur de continuation de ligne (_) pour encapsuler l'instruction. Pour des raisons de lisibilité, je mettrais la requête dans une variable, comme ceci:

qry = "SELECT PATH301 FROM NC301B " & _
      "WHERE EDIPROC like 'P30_' AND (LF301M > 0) " & _
      "AND (PATH301 NOT LIKE '%saptemp%') " & _
      "AND (PATH301 NOT LIKE '%SAPTEMP%') " & _
      "AND (PATH301 NOT LIKE '%usr%') " & _
      "AND (PATH301 NOT LIKE '%Windows%');"
rs.open qry, cn, 3

Les chaînes multilignes ne sont pas prises en charge dans VBScript.

12
Ansgar Wiechers

Utiliser la continuation de ligne (_) et concaténation ou Join:

s = "a b c"
WScript.Echo s
s =   "a " _
    & "b " _
    & "c"
WScript.Echo s
s = Join(Array( _
          "a" _
        , "b" _
        , "c" _
))
WScript.Echo s

sortie:

cscript 37564704.vbs
a b c
a b c
a b c
4
Ekkehard.Horner

Devrait faire ce que vous voulez, en supposant que vous vouliez juste qu'il soit plus joli; cela n'affecte aucune fonctionnalité ...

rs.open "SELECT PATH301 FROM NC301B " & _
"WHERE EDIPROC like 'P30_' " & _
"AND (LF301M > 0) " & _
"AND (PATH301 NOT LIKE '%saptemp%') " & _
"AND (PATH301 NOT LIKE '%SAPTEMP%') " & _ 
"AND (PATH301 NOT LIKE '%usr%')  " & _
"AND (PATH301 NOT LIKE '%Windows%');", cn, 3
3
Dave