将字符串拆分为多行

2024-01-10

我编写了一个连接到 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

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

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

那第一SELECT声明太大了,看起来一点也不好看。 我希望你明白我的意思。


好吧,无论如何我都会发布一个答案,从来都不是这个的粉丝西部最快的枪问题 https://meta.stackexchange.com/q/9731/202529

使用行继续符

As I 评论中提到 https://stackoverflow.com/questions/37564704/split-select-statement/37565683#comment62617433_37564961听起来您想让 SQL 命令在代码中更具可读性。执行此操作的正常方法是使用行继续符(_)也称为语句中断 https://technet.microsoft.com/en-us/library/ee198844.aspx.

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%');"

请记住,如果我们不处理字符串,则情况会有所不同,例如继续If两行的语句看起来像这样;

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

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

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%');"

这完全取决于个人喜好,并且任何一种方式都比其他方式没有任何性能优势。

就我个人而言,尽管我发现这种方法弊大于利,尤其是在涉及 SQL 字符串时。

使用字符串连接

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

AND (PATH301 NOT LIKE '%SAPTEMP%')

尝试注释掉该行将生成

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%');"

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

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%');"

尽管需要一些额外的工作,但它更加灵活,并且允许您通过注释掉行来测试 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%');"

我喜欢做的另一件小事是在每一行后面加上& 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%');"

这样输出字符串的时候(在使用经典 ASP、WScript 等)它的格式正确并且在 HTML 页面中显示时正确(如果使用经典 ASP)你可以轻松使用

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字符串拆分为多行 的相关文章

随机推荐

  • 使用严格会导致未定义的函数

    我正在尝试组织我的 js 文件并遵循建议的模块模式 当我在此模式中使用 use strict 时 函数被声明为未定义 如果没有 use strict 方法 该函数就可以正常工作 是否建议使用严格模式 如果是 为什么该功能在使用它时不起作用
  • 如何在android平台的unity3d中使用c#线程?

    我需要加载文件 场景并在线程中播放动画 尝试在 Android 中通过 www 加载文件 如何通过线程做其他事情 但是为什么游戏引擎不允许我们创建线程呢 或者我的理解是错误的 如何在 UNITY3D 中创建线程 您可以在 Unity 中使用
  • 取消设置会话 PHP 不能正常工作

    我想在单击注销按钮时取消设置用户名和购物车 如果我想放置 如果单击注销 那么会话将取消设置 我应该怎么做 我的代码有效 然而 当我再次点击登录时 登录信息不存储在会话中 它不断要求我再次登录 而不是进行通常的流程 我可以知道出了什么问题吗
  • 使用 System.IO.Packaging 在 C# 中创建 zip

    我正在尝试在服务器上动态创建 zip 文件 其中包含来自在线服务的照片 但是当我尝试打开该文件时 WinRar 说该文件格式未知或已损坏 这是代码 MemoryStream stream new MemoryStream Package p
  • 将值替换为在 unix shell 中对值调用函数的结果

    我有一个如下所示的文本流 s123456789 9780 heartbeat test 1344280205000000 0 heartbeat test 1344272490000000 0 这些长数字是以微秒为单位的时间戳 我想通过某种
  • 如何在ctypes python中传递char指针作为参数

    请帮助我将以下 c 代码行转换为 ctypes python Ret openFcn Handle C Config xml 以下是各自的声明 typedef uint16 t OpenDLLFcnP void const char Ope
  • 如何从 ASPX 控件事件调用 Javascript 函数?

    如何从 ASPX 控件事件调用 Javascript 函数 具体来说 我想从 DropDownList 的 SelectedIndexChanged 事件中调用该函数 每当我看到这种问题时 我都会有点紧张 因为十有八九这意味着提问者并不真正
  • 前景窗口与活动窗口

    在Windows中 前台窗口和活动窗口有什么区别 具体来说 什么情况下前台窗口不能是活动窗口 如果这两个术语指的是同一概念 那么为什么有两个术语 The msdn documentation here mentions clicking a
  • 在 Rails 3 中生成 RSS feed

    我正在寻找在 Rails 3 中生成提要的最佳实践 标准模式 是http railscasts com episodes 87 generate rss feeds http railscasts com episodes 87 gener
  • Angular 1.5 中的组件通信

    Angular 1 5 组件通信建议通常具有输出绑定来调用根控制器上的方法 假设我有一个根组件和两个子组件
  • 默认命名空间是什么

    C 中的默认命名空间是什么 include
  • 使用 cron 发送电子邮件并包含来自 Moodle 的电子邮件附件

    我只想向已完成特定课程的用户发送电子邮件 并添加 pdf 文件 完成课程的证书 作为电子邮件的附件 并使用 Moodle cron 在特定时间执行此操作 我查看了一些插件来了解它是如何完成的 但我仍然不确定我到底应该如何做到这一点 I ne
  • ServerSocket + 客户端套接字 - 如何获取客户端的 IP 地址?

    我有一个正在侦听连接的 ServerSocket 实例 当客户端连接到它时 我想获取所连接套接字的IP 但似乎找不到正确的方法 public void start listenSocket new ServerSocket port con
  • .net中如何将一个流的内容写入另一个流?

    我经常遇到这样的问题 我有一个充满数据的流 并且想将其所有内容写入另一个流 所有代码示例都使用字节数组形式的缓冲区 有更优雅的方法吗 如果不是 缓冲区的理想大小是多少 哪些因素构成了这个值 在 NET 4 0中我们终于得到了Stream C
  • Mac VoiceOver 会读取列表项目两次

    这是我的html ul li Hello li li World li ul 我在 Mac OS X 10 11 5 上使用 VoiceOver 当我浏览此页面时VO A 我听到以下内容 HTML 内容 列出两项 子弹 你好 小组 Hell
  • java.lang.NoSuchMethodError:android.app.Notification$Builder.build

    我刚刚在我的应用程序的通知栏中添加了通知图标 该应用程序支持 Android gt 11 并且开始抛出以下错误 java lang NoSuchMethodError android app Notification Builder bui
  • 海洛库:!您无权访问应用程序 heroku

    我最初有一个应用程序 设置了默认名称 heroku 不过我想改变这一点 所以我有两个应用程序 一个是登台应用程序 一个是生产应用程序 遵循 Heroku 指南here https devcenter heroku com articles
  • flex 不能对一个 div 使用两个对齐方式

    我需要一个卡片列表布局 为此我使用 Flex 在大型设备中一切正常但是当设备变小并且两张牌不能相邻并且转到下一行 我的内容这不是中心 换句话说 我需要center我的内容在所有设备尺寸以及两张卡放在一起时应该是和中心之间的空间 contai
  • 为什么 fseek 使用 read() 系统调用?

    我试图理解 glibc 的实现fseek 为此 我下载了 glibc 源代码并尝试了解其函数执行顺序 我找到了fseek实施于libio fseek c 基本上 它调用函数 或者更确切地说是宏 IO fseek 使用相同的参数 该宏的实现是
  • 将字符串拆分为多行

    我编写了一个连接到 Oracle 数据库以选择特定表中的多个条目的脚本 该声明如下所示 rs open SELECT PATH301 FROM NC301B WHERE EDIPROC like P30 AND LF301M gt 0 AN