94 votes

Equivalent du RowID d'Oracle dans SQL Server

Quel est l'équivalent du RowID d'Oracle dans SQL Server ?

5voto

user2793105 Points 21

Si vous souhaitez numéroter de façon permanente les lignes de la table, n'utilisez pas la solution RID pour SQL Server. Ses performances seront pires que celles d'Access sur un vieux 386. Pour SQL Server, créez simplement une colonne IDENTITY, et utilisez cette colonne comme clé primaire en grappe. Cela placera un Integer B-Tree permanent et rapide sur la table, et plus important encore, chaque index non clusterisé l'utilisera pour localiser les lignes. Si vous essayez de développer en SQL Server comme s'il s'agissait d'Oracle, vous créerez une base de données peu performante. Vous devez optimiser pour le moteur, et non pas prétendre qu'il s'agit d'un moteur différent.

De plus, n'utilisez pas la fonction NewID() pour remplir la clé primaire avec des GUIDs, vous détruiriez les performances d'insertion. Si vous devez utiliser des GUIDs, utilisez NewSequentialID() comme colonne par défaut. Mais INT sera toujours plus rapide.

Si, en revanche, vous souhaitez simplement numéroter les lignes qui résultent d'une requête, utilisez la fonction RowNumber Over() comme l'une des colonnes de la requête.

4voto

Curt Sampson Points 10866

De http://vyaskn.tripod.com/programming_faq.htm#q17 :

Oracle dispose d'un rownum pour accéder aux lignes d'une table en utilisant le numéro de ligne ou l'identifiant de ligne. Existe-t-il un équivalent pour cela dans SQL Server ? Ou comment générer sortie avec le numéro de ligne dans SQL Server ?

Il n'existe pas d'équivalent direct au rownum ou au row id d'Oracle dans SQL Server. À proprement parler, dans une base de données relationnelle, les lignes d'une ne sont pas ordonnées et un ID de ligne n'a pas vraiment de sens. Mais si vous avez besoin de cette fonctionnalité, considérez les trois alternatives suivantes :

  • Ajouter un IDENTITY à votre table.

  • Utilisez la requête suivante pour générer un numéro de ligne pour chaque ligne. La requête suivante génère un numéro de ligne pour chaque ligne de la table auteurs de la base de données pubs. Pour que cette requête fonctionne, la table doit avoir une clé unique. clé unique.

    SELECT (SELECT COUNT(i.au_id) 
            FROM pubs..authors i 
            WHERE i.au_id >= o.au_id ) AS RowID, 
           au_fname + ' ' + au_lname AS 'Author name'
    FROM          pubs..authors o
    ORDER BY      RowID
  • Utilisez une approche de table temporaire, pour stocker l'ensemble des résultats dans une table temporaire, avec un identifiant de ligne généré par la fonction IDENTITY() fonction. La création d'une table temporaire sera coûteuse, surtout lorsque vous travaillez avec de grandes tables. Optez pour cette approche si vous n'avez pas de clé unique dans votre table. une clé unique dans votre table.

4voto

Si vous souhaitez simplement une numérotation de base des lignes pour un petit jeu de données, que diriez-vous de quelque chose comme ceci ?

SELECT row_number() OVER (order by getdate()) as ROWID, * FROM Employees

1voto

Erik Points 17

ROWID est une colonne cachée sur les tables Oracle, donc, pour SQL Server, construisez votre propre colonne. Ajoutez une colonne appelée ROWID avec une valeur par défaut de NEWID() .

Comment le faire : Ajouter une colonne, avec une valeur par défaut, à une table existante dans SQL Server

1voto

Jim Points 149

Veuillez consulter http://msdn.microsoft.com/en-us/library/aa260631(v=SQL.80).aspx Dans le serveur SQL, un timestamp n'est pas la même chose qu'une colonne DateTime. Elle est utilisée pour identifier de manière unique une ligne dans une base de données, pas seulement une table mais la base de données entière. Cela peut être utilisé pour la concurrence optimiste. par exemple UPDATE [Job] SET [Name]=@Name, [XCustomData]=@XCustomData WHERE ([ModifiedTimeStamp]=@Original_ModifiedTimeStamp AND [GUID]=@Original_GUID

le ModifiedTimeStamp garantit que vous mettez à jour les données d'origine et échouera si une autre mise à jour a été effectuée sur la ligne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X