【问题标题】:SQL fixed-length insert statement formatterSQL 固定长度插入语句格式化程序
【发布时间】:2009-12-30 13:06:13
【问题描述】:

假设我有这么长的插入语句

insert into table1 (id, name, phone, very_long_col_name, ...) 
            values (1, 'very long name indeed...', '555-555-5555', 1, ...)

正如您在上面看到的,很难从它们的列中分辨出值,因为它们的长度是不均匀的

我正在寻找一些东西(例如命令行实用程序)将上述(不仅仅是 SQL 格式)格式化为:

insert into table1 (id, name                      , phone         , very_long_col_name, ...) 
            values (1 , 'very long name indeed...', '555-555-5555', 1                 , ...)

这样我可以很容易地看到哪个值与哪个列对应

它可以是 notepad++ 的插件、java 实用程序、SQL IDE 的插件,有什么用...

准备好的语句、T-SQL 参数、Hibernate、JPA 等现在不是一个选项

【问题讨论】:

  • Oracle SQL Developer 或 Microsoft SQL Server Management Studio

标签: sql sql-server oracle code-formatting


【解决方案1】:

不建议使用插件,但我经常看到这种格式的东西:

insert into table1 
       (
         id, 
         name,
         phone, 
         very_long_col_name, 
         ...
       ) 
values 
       (
         1, 
         'very long name indeed...', 
         '555-555-5555', 
         1, 
         ...
       )

我发现这比滚动很长的一行更具可读性。

【讨论】:

  • 对于包含很多列的表,我还将在每个值之后添加列名的注释。例如:1、--id
  • 由于没有提出更好的解决方案,因此这是公认的答案。谢谢奥德...
【解决方案2】:

您考虑过以下alternative syntax吗?

INSERT INTO `table` SET
    `id` = 1,
    `name` = 'very long name indeed...',
    `phone` = '555-555-5555',
    `very_long_col_name` = 1,
    `...` = '...'
;

【讨论】:

  • 这不是 SQL-Server 的有效 sql 语法
  • @Oded:由于他没有提到任何特定的数据库,我认为他使用的是 MySQL。无论如何,我正确地标记了这个问题。
【解决方案3】:

最好的办法是使用 SQL 准备语句。这使您可以将 SQL 查询语法与数据分开,因此您首先要准备语句:

$statement = mysqli_prepare("INSERT INTO `blah` (`id`,`phone`,`name`) VALUES(?,?,?)");

然后你将数据绑定到语句中:

$statement->bind('iss', 1234, "(555) 123-4567", "Kris");

我以 PHP 为例,上面代码中的 'iss' 表示它按顺序绑定了一个 Int 和 2 个字符串。

【讨论】:

    【解决方案4】:

    如果包含您的 SQL 语句的地方包含您要插入的 DATA,那么您很可能正在做一些非常、非常、非常错误的事情。

    你想达到什么目标?是否要格式化查询,以便可以以漂亮的样式转储它以进行调试?好吧,这很简单,只需在代码中的适当位置添加strlen(some_string)-some_fixed_number 空格数。我不能在这里建议实际的代码,因为我不知道你使用什么语言或者你喜欢什么编码风格等等......

    但即使我想这样做,我也看不出这有什么价值。您应该将 SQL 查询和您在 SQL 查询中使用的数据(例如,用于插入)分开。

    出于某些很好的原因(引用、sql 注入等...),动态构建 SQL 查询字符串已经过时了。

    编辑:如果你想格式化一个 SQL 转储或一些准备数据库的 INSERT 语句,那么你可以只使用 CSV 格式的数据。它比 SQL 语句更容易阅读。

    【讨论】:

    • 对于我们的代码,我们使用 Hibernate 而不是普通的 SQL(当我们这样做时,我们使用准备好的语句,更糟糕的是)但这用于各种原因 - 例如。 db创建、mock数据、开发集成等
    【解决方案5】:

    变量?

    insert into
    table1 ( id,  name,  phone,  very_long_col_name, ...) 
    values (@id, @name, @phone, @long_val, ...)
    

    (显然你也需要declare 和set / select 这些)

    【讨论】:

    • 不错的方法,但是请看我对frunsi的评论,给出了查询的当前结构,我无法更改,我只想看清楚。
    【解决方案6】:

    在 Oracle 中(因为我们可以从对偶中进行选择)我喜欢将这些设置为 insert into select from,这样我可以为列设置别名并使其更易于阅读:

    insert into table1 
    (
     id, 
     name, 
     phone, 
     very_long_col_name,
     ...
    ) 
    select 1 id, 
           'very long name indeed...' name, 
           '555-555-5555' phone, 
           1 very_long_col_name, 
           ...
      from dual;       
    

    【讨论】:

      【解决方案7】:

      想要同样的东西,所以我构建了这个 javascript 工具:

      SQL Insert Formatter

      它完全按照您的要求执行并处理多个语句。它只是客户端,因此无需担心您的数据会被上传。

      【讨论】:

      • 我仍然更喜欢接受的答案。另外,请不要向#sqlhelp 主题标签发送垃圾邮件。
      • 这有问题正确格式化查询,例如:INSERT INTO [dbo].[SuperHeroes] (Name, date, HomePlanet) VALUES (N'Kent, Clark', getDate(), N'Krypton', 33);
      猜你喜欢
      • 2012-05-04
      • 1970-01-01
      • 2014-09-07
      • 2017-04-30
      • 2012-08-03
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多