在手写代码中使用 SQL Server 的括号表示法有意义吗?

ber*_*d_k 15 sql-server style t-sql

当代码生成器使用新的 Microsoft 括号表示法 ( []) 为几乎所有内容生成输出时,它们往往更简单。

当我第一次看到它时,我虽然哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇当时有些禁止引用的标识符符号表示法被禁止引用的标识符符号的转世。

据我所知,它是 Microsoft 的专有扩展(意味着 Oracle 不支持它)。

查看 SQL Server,如果您定义一个表,则没有区别

CREATE TABLE [dbo].[Table_2] ([col1] [int], [col2] [int]);
Run Code Online (Sandbox Code Playgroud)

或者

CREATE TABLE dbo.Table_2 (col1 int, col2 int);
Run Code Online (Sandbox Code Playgroud)

这是个人或公司风格的问题。始终如一。

现在,如果您想将数据库迁移到 Oracle,括号是没有选择的。

您可以使用旧的带引号的标识符,但这些标识符区分大小写,这会导致很多麻烦。

从生成的代码中删除所有括号、避免使用空格、其他特殊字符和保留关键字作为名称,并且仅以大多数 DBMS 理解的方式进行编码是否是个好主意?

one*_*hen 12

标准 SQL"对带引号的标识符使用双引号。SQL Server 使用QUOTED_IDENTIFIER选项(ANSI_QUOTES在 mySQL 中)支持这一点。标准 SQL 总体上提高了可移植性,在这种情况下将移植到 Oracle。同样,我将 SQL 关键字更改为大写(中级 SQL-92 要求)并扩展intINTEGER(入门级 SQL-92 要求)。

IMO,应该避免不必要地使用带引号的标识符,无论其风味如何。


小智 10

这是一个主观问题,但不必要的括号在我最讨厌的列表的顶部附近 - 比拼错“!=”更烦人,但不如列列表中的前导逗号那么糟糕。

客观地说,考虑括号的目的:允许对象名称否则不合法。考虑到这个目的,括号在最坏的情况下是一种代码气味,在最好的情况下是一种懒惰的标志。

  • 前导逗号使新列的开始位置非常清楚。括号绝对*不是*代码味道,因为它们清楚地描述了什么是列名,什么不是。我不是说你*必须*使用它们,而是说它们表明问题是一个巨大的过度。 (2认同)

Nic*_*mas 10

  • 如果您的表或列名称:

    • 包含一个空格: SELECT [column name] FROM table;
    • 包含括号:SELECT [wt[f], 或SELECT [wt]]f]
    • 包含像或这样的非字母数字符号(是的,它们可以包含这些符号!)^!
    • 保留关键字,KEY, STATE, RULE, ...

    显然,如果您可以控制架构,那么请避免使用这些名称。但是,在某些情况下,最好的名称是保留名称(例如KEY通用键值表中的键列),因此您可以决定使用它的程度(因此必须在任何地方引用它)。

    我还使用方括号来抑制蓝色突出显示,SSMS 和 VS 给出了一些类似DESCRIPTIONSQL Server 没有保留的关键字,但对于这些工具来说是特殊的。

  • 动态生成 SQL 时一定要使用方括号。这样做的简单方法是调用QUOTENAME()您动态引用的对象(例如SELECT QUOTENAME(name) FROM sys.databases;)。sp_MSforeachdb,例如,不这样做


A-K*_*A-K 7

我什至可能不会尝试使用便携式 DDL。如果需要的话,如果我从 SQL Server 的系统视图生成 Oracle 表定义,我会更好。

我认为编写可移植 DML 也没有意义——PL/SQL 与 T-SQL 完全不同。为了可移植性,通过存储过程的 API 更容易公开您的数据库。这些过程的签名在两个平台上必须相同,但实现可以使用专有功能 - 总体而言,这比尝试仅使用 ANSI 标准 SQL 容易得多。

该结论基于多年在 Oracle 和 SQL Server 上开发便携式系统的经验。


dat*_*god 6

当我编写生成代码的代码时,我将方括号放在数据库对象名称周围。我在手动编写代码时不包括括号,而且我发现它会降低代码的可读性。我还禁止带有空格的数据库对象名称。SQL Server 允许您在对象名称中使用空格,但这并不意味着这是一件好事。