打破多行的字符串

rel*_*0ne 17 vbscript

我编写了一个脚本,该脚本连接到Oracle数据库以选择特定表中的多个条目.

声明如下:

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
Run Code Online (Sandbox Code Playgroud)

现在我想知道是否可以将此语句拆分为多行.例如这样:

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
Run Code Online (Sandbox Code Playgroud)

第一个SELECT声明是大而不好看的方式.我希望你明白我的意思.

Lan*_*art 37

好吧,无论如何我都会发一个答案,从未成为西方问题中最快枪的粉丝

使用线连续字符

正如我在评论中提到的,听起来你想让SQL命令在代码中更具可读性.正常的方法是使用Line Continuation Character (_),也称为Statement Break.

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%');"
Run Code Online (Sandbox Code Playgroud)

请记住,如果我们不处理字符串,这会有所不同,例如继续If对两行进行声明会看起来像这样;

If result = ( _
  condition1 _
  And condition2 _
  And condition3) Then
Run Code Online (Sandbox Code Playgroud)

因为我们不能跨行破坏字符串,所以我们通过终止继续行的字符串然后将字符串连接到下一个字符串来作弊& _.这也意味着这将起作用;

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%');"
Run Code Online (Sandbox Code Playgroud)

这完全取决于个人偏好,并且没有任何方式比它的对手有任何性能优势.

就个人而言,虽然我发现这种方法比较麻烦,但它值得,特别是在SQL字符串方面.

使用字符串连接

假设您想在没有其中一个条件的情况下进行测试

AND (PATH301 NOT LIKE '%SAPTEMP%')
Run Code Online (Sandbox Code Playgroud)

试图注释掉那条线会产生一个

Microsoft VBScript编译错误:
语法错误

这是一个例子;

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%');"
Run Code Online (Sandbox Code Playgroud)

这使得它非常不灵活,这就是为什么我更喜欢使用String Concatenation来构建一个字符串,就像这样;

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%');"
Run Code Online (Sandbox Code Playgroud)

虽然有一点额外的工作,但它更灵活,允许您通过注释掉行而不影响整个SQL字符串来测试SQL字符串,就像这样;

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%');"
Run Code Online (Sandbox Code Playgroud)

我喜欢做的另一件小事就是像这样跟着每一行& vbNewLine;

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%');"
Run Code Online (Sandbox Code Playgroud)

这样当输出字符串(使用经典ASP,WScript等)时,它正确格式化,当在HTML页面中显示时(如果使用经典ASP),您可以轻松使用

sql = Replace(sql, vbNewLine, "<br />")
Run Code Online (Sandbox Code Playgroud)

正确格式化,在尝试使用动态SQL调试问题时非常有用.


Ans*_*ers 12

SQL语句是一个字符串,因此您可以将其拆分为多个字符串并将它们连接起来.使用行继续运算符(_)来包装语句.出于可读性原因,我将查询放在变量中,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

VBScript不支持多行字符串.