Quel est l'équivalent du RowID d'Oracle dans SQL Server ?
Réponses
Trop de publicités?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.
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.
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
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.