如何在VB.NET中编写可读的SQL

时间:2015-07-30 01:59:02

标签: sql vb.net readability

在VB.NET中编写Sql时,由于VB缺少多行字符串,常常会出现一些非常难以理解的内容。

例如:

Dim sql As String = "SELECT t1.Name, t1.Description, t1.Address, t1.PhoneNumber, t2.RegistrationID, t2.Date, t2.Description, t2.RegistrationStatus FROM Users t1 JOIN Registrations t2 ON t1.UserID = t2.UserID WHERE t2.RegistrationID = @RegistrationID"

您可以使用行继续符来打破字符串,但额外的引号和行继续符会使这更难阅读。此外,它使得在代码和SSMS之间传输查询变得困难。

是否有一种解决方案可以使VB在VB中可读,并且还允许在VB代码和SSMS(或任何其他SQL编辑器/ IDE)之间轻松传输查询(通过复制/粘贴)?

3 个答案:

答案 0 :(得分:3)

我找到的最佳解决方案是使用VB的XML literals功能(自VS 2008起可用)。
XML文字属性允许使用多行字符串。

Dim sql As String =
    <sql text="
        SELECT t1.Name, 
               t1.Description, 
               t1.Address, 
               t1.PhoneNumber, 
               t2.RegistrationID, 
               t2.Date, 
               t2.Description, 
               t2.RegistrationStatus 
        FROM   Users t1 
               JOIN Registrations t2 ON t1.UserID = t2.UserID 
        WHERE   t2.RegistrationID = @RegistrationID
    " />.Attribute("text").Value
  

需要注意的是,大于和小于比较需要编码为XML实体:<变为&lt;>变为&gt;

答案 1 :(得分:2)

您是否可以升级到 Visual Studio 2015
您可以在 Visual Basic 14 中使用新的多行字符串文字

Dim sql As String = "
    SELECT t1.Name, 
           t1.Description, 
           t1.Address, 
           t1.PhoneNumber, 
           t2.RegistrationID, 
           t2.Date, 
           t2.Description, 
           t2.RegistrationStatus 
    FROM   Users t1 
           JOIN Registrations t2 ON t1.UserID = t2.UserID 
    WHERE   t2.RegistrationID = @RegistrationID
"

以前从XML多线程中没有任何限制(<&,......的问题)。您需要在字符串中转义的唯一内容是"(将其替换为"")。

优秀的新字符串插值功能可帮助您以前所未有的方式呈现字符串:

Dim tableName As String = "Registrations"
Dim currentOrderByColumn As String = "t2.Date"

Dim sql = $"SELECT t1.Name, t1.Description FROM {tableName} ORDER BY {currentOrderByColumn}"

Dim sql2 = $"
    SELECT t1.Name, t1.Description
    FROM {tableName}
    ORDER BY {currentOrderByColumn}
"

插值字符串内的表达式也完全支持变量重命名,因此将tableName重命名为mainTableName也会在字符串中执行重命名。

您需要在此类字符串中处理的其他字符是{} - 您必须分别用{{}}替换它们。但是在T-SQL中they have only one specific purpose

更多信息:12

  

注意:如果您希望暂时继续使用弃用的XML解决方法,请不要使用表单
  <tag attribute="text" />.Attribute("attribute").Value
  因为它删除了新的行字符导致奇怪的SQL单行文字如什么   SELECT t1.Name, t1.Description, t2.Date FROM Users t1

     

相反,请使用表格
  <tag>text</tag>.Value
  哪个保留行结尾所以你看到的(在代码编辑器中)就是你得到的(在SQL命令处理器的输入处)。 SQL可读性是此Q / A的主要目标,此细节是其中的一部分。

     

(但请记住,XML中这种改进形式的SQL也已弃用,它也可以使用,但请尽快放弃。)

答案 2 :(得分:0)

我打开和关闭自动换行。

Edit&GT; Advanced&GT; Word wrap

我发现值得将它添加为Visual Studio工具栏的按钮。