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


15

当代码生成器使用[]几乎所有内容的新Microsoft括号符号()生成输出时,它们通常会更简单。

当我第一次看到它时,我虽然赞叹了一些被禁止的引用标识符符号的转世。

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

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

CREATE TABLE [dbo].[Table_2] ([col1] [int], [col2] [int]);

要么

CREATE TABLE dbo.Table_2 (col1 int, col2 int);

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

现在,如果您要将数据库迁移到Oracle,则没有选择。

您可以使用旧的带引号的标识符,但是它们区分大小写,这会造成很多麻烦。

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

Answers:


12

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

国际海事组织,无论哪种口味,都应避免不必要地使用带引号的标识符。


10

这是一个主观的问题,但是不必要的括号位于我的小玩意儿列表的顶部–比拼错“!=”稍微令人讨厌,但不如列列表中的逗号引起。

客观地说,请考虑方括号的目的:允许使用否则不合法的对象名称。鉴于此目的,括号在最坏的时候是代码的味道,在最好的情况下是懒惰的标志。


前导逗号使新列从何处清晰可见。括号绝对不是代码气味,因为它们清楚地描述了什么是列名,什么不是列名。我并不是说您必须使用它们,而是要说它们表明问题是一个很大的范围。
Max Vernon

9
  • 如果您的表或列名称为括号,则必须使用:

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

    显然,如果您可以控制架构,那么请避免使用此类名称。但是,在某些情况下,最佳名称是保留名称(例如KEY,通用键值表中的键列),因此取决于您决定使用该名称的严重程度(因此必须在各处引用该名称)。

    我还使用方括号来抑制蓝色突出显示SSMS和VS给出了DESCRIPTIONSQL Server不会保留的某些关键字,但这些关键字在其他情况下是特殊的。

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


6

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


6

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.