web-dev-qa-db-fra.com

Cela a-t-il un sens d'utiliser la notation SQL Server Sharket dans le code écrit à la main?

Les générateurs de code ont tendance à être plus simples lorsqu'ils génèrent une sortie à l'aide de la nouvelle notation de support Microsoft ([]) pour presque tout.

Quand je l'ai vu pour la première fois, j'envoie une réincarnation de la notation d'identifiant citation quelque peu bannie.

Autant que je sache, c'est une extension exclusive de Microsoft (signification Oracle ne le supporte pas).

En regardant SQL Server, il n'y a pas de différence si vous définissez une table comme

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

ou alors

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

C'est une question de style personnel ou d'entreprise. Être cohérent.

Maintenant, si vous souhaitez migrer votre base de données sur Oracle, les crochets ne sont pas une option.

Vous pouvez utiliser les anciens identifiants cités, mais ceux-ci sont sensibles à la casse qui provoque beaucoup de problèmes.

Est-il une bonne idée de supprimer toutes les crochets du code généré, évitez d'utiliser des blancs, d'autres caractères spéciaux et des mots-clés réservés pour les noms et simplement le code de la plupart des DBMS?

15
bernd_k

SQL standard utilise la double citation " pour les identificateurs cités. SQL Server prend en charge cette utilisation en utilisant le QUOTED_IDENTIFIER option (ANSI_QUOTES dans mysql). SQL standard améliore la portabilité en général et dans ce cas portera à Oracle. De même, je changerais de mots-clés SQL en majuscules (exigence de SQL-92 intermédiaire) et développez int à INTEGER (Niveau d'entrée SQL-92).

Utilisant inutilement les identificateurs cités, quelle que soit la saveur, devraient être évités, imo.

12
onedaywhen
  • Des crochets sont requis si votre table ou vos noms de colonne:

    • contenir un espace: SELECT [column name] FROM table;
    • contenir un support: SELECT [wt[f], ou SELECT [wt]]f]
    • contenir un symbole non alphanumérique comme ^ ou ! (Oui, ils peuvent contenir ces symboles!)
    • sont Mots-clés réservés comme KEY, STATE, RULE, ...

    Évidemment, si vous avez le contrôle sur le schéma, évitez d'utiliser des noms comme ceux-ci. Cependant, dans certains cas, le meilleur nom est réservé (comme _ KEY pour la colonne clé d'une table de valeur de clé générique), il appartient donc à vous de décider à quel point vous souhaitez l'utiliser (et donc avoir pour la citer partout).

    J'utilise également des crochets pour supprimer le bleu sur la surbrillance que SSMS et VS donnent des mots-clés tels que DESCRIPTION qui ne sont pas réservés par SQL Server, mais sont par ailleurs spéciales à ces outils.

  • Utilisez définitivement des crochets lorsqu'il générer de manière dynamique SQL. Le moyen facile de le faire est d'appeler QUOTENAME() sur les objets que vous référencez de manière dynamique (E.G. SELECT QUOTENAME(name) FROM sys.databases;). sp_MSforeachdb, Par exemple, ne le fait pas .

9
Nick Chammas

Je n'essayerais probablement pas d'avoir un DDL portable. Je serais mieux éteint si j'ai généré des définitions de table Oracle hors des vues du système SQL Server, si nécessaire.

Je ne pense pas qu'il est logique d'écrire DML portable soit - PL/SQL est totalement différent de T-SQL. Pour la portabilité, il est plus facile d'exposer votre base de données via une API de procédures stockées. Les signatures de ces procédures doivent être identiques sur les deux plates-formes, mais les implémentations peuvent utiliser des fonctionnalités exclusives - dans l'ensemble, c'est beaucoup plus facile que d'essayer d'utiliser uniquement l'ANSI Standard SQL.

Cette conclusion est basée sur plusieurs années d'expérience dans le développement de systèmes portables, travaillant à la fois sur Oracle et SQL Server.

7
A-K

Lorsque je répète le code qui génère du code, je pose les crochets autour des noms d'objet de base de données. Je n'inclut pas les supports lorsque vous écrivez le code à la main et je trouve qu'il nuit à la lisibilité du code. J'interdit aussi des noms d'objet de base de données avec des espaces. SQL Server vous permettra d'utiliser des espaces dans les noms d'objets, mais cela ne signifie pas que c'est une bonne chose.

6
datagod