SQL固定长度插入语句格式化程序

3
假设我有这条很长的插入语句:
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。 - Eran Medan
请看这里!将逻辑复制到您的语言中。https://dev59.com/pc36oIgBc1ULPQZF7z1x#74609752 - Guilherme Almeida Girardi
7个回答

7

我不是在推荐插件,但通常我看到这种格式的东西被格式化成这样:

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

我认为这种方式比滚动浏览一条很长的行要更易读。


5
针对列较多的表格,我会在每个值后面添加该列名称的注释。例如:1, -- id - Tom H
既然没有更好的解决方案被提出,这就是接受的答案。 感谢Oded... - Eran Medan

2

您是否考虑过以下备选语法

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

2
这不是 SQL-Server 的有效 SQL 语法。 - Oded
1
@Oded:由于他没有提到具体的数据库,我假设他在使用MySQL。无论如何,我已经正确标记了这个问题。 - Alix Axel

1
你更好的选择是使用SQL预处理语句。这样可以将SQL查询语法与数据分离,因此你需要先准备好语句:
$statement = mysqli_prepare("INSERT INTO `blah` (`id`,`phone`,`name`) VALUES(?,?,?)");

接下来,您需要将数据与语句进行绑定:

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

我以PHP为例,上面代码中的“iss”表示按顺序绑定一个整数和两个字符串。

1

变量?

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

(显然,您需要声明设置 / 选择这些内容)


不错的方法,但请看看我对frunsi的评论,查询的当前结构已经给出,我无法更改它,我只想清楚地看到它。 - Eran Medan

1
在Oracle中(因为我们可以从dual中选择),我喜欢将它们转换为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;       

1

如果包含您的SQL语句的位置包含您要插入的数据,那么您很可能做错了一些非常、非常、非常糟糕的事情。

您想实现什么?您想格式化查询,以便可以以漂亮的样式进行调试?嗯,这很容易,只需在代码中适当的位置添加strlen(some_string)-some_fixed_number个空格即可。我无法在这里提供实际的代码,因为我不知道您使用的是什么语言或者您偏好什么编码风格等等...

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

动态构建SQL查询字符串已经过时了,有一些非常好的理由(引号、SQL注入等等)。

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


我们的代码中使用Hibernate而不是纯SQL(即使我们使用时,最坏的情况下也会使用预编译语句),但这是出于各种原因 - 例如数据库创建、模拟数据、开发集成等。 - Eran Medan

1

我有同样的愿望,所以我开发了这个JavaScript工具:

SQL插入格式化程序

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


我仍然更喜欢被接受的答案。此外,请不要滥用 #sqlhelp 标签。 - spaghettidba
这段代码存在问题,无法正确格式化带有函数的查询语句,例如:INSERT INTO [dbo].[SuperHeroes] (Name, date, HomePlanet) VALUES (N'Kent, Clark', getDate(), N'Krypton', 33); - Copy and Paste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接