Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Vérifier si une table a une colonne TIMESTAMP dans SQL Server avec OBJECTPROPERTY()

Vous pouvez utiliser le OBJECTPROPERTY() fonction dans SQL Server pour vérifier si une table a ou non un horodatage colonne.

Pour ce faire, passez l'ID d'objet de la table comme premier argument, et TableHasTimestamp comme deuxième argument. La fonction renvoie un 1 ou un 0 selon qu'il a ou non un horodatage colonne.

Une valeur de retour de 1 signifie que la table fait avoir un horodatage colonne et une valeur de 0 signifie que non.

Cela fonctionne également pour les colonnes qui ont été définies comme rowversion (horodatage est le synonyme obsolète de rowversion ).

Exemple 1 - Une colonne d'horodatage

Voici un exemple rapide à démontrer sur une table avec un horodatage colonne.

USE Test_timestamp;
SELECT OBJECTPROPERTY(OBJECT_ID('Pet'), 'TableHasTimestamp') AS [TableHasTimestamp];

Résultat :

+---------------------+
| TableHasTimestamp   |
|---------------------|
| 1                   |
+---------------------+

Dans ce cas, le Test_timestamp la base de données a une table avec l'ID fourni, et elle a un horodatage colonne.

J'utilise le OBJECT_ID() fonction pour récupérer l'ID de la table en fonction de son nom.

Exemple 2 - Une colonne rowversion

Comme mentionné, cette méthode fonctionne également si vous avez utilisé rowversion pour définir la colonne.

Par exemple, si je crée un tableau comme suit :

CREATE TABLE Owner (
  OwnerId int PRIMARY KEY, 
  OwnerName varchar(255), 
  RowVersion rowversion
  );

Puis lancez une vérification :

SELECT OBJECTPROPERTY(OBJECT_ID('Owner'), 'TableHasTimestamp') AS [TableHasTimestamp];

Résultat :

+---------------------+
| TableHasTimestamp   |
|---------------------|
| 1                   |
+---------------------+

Je remarque que, bien que la documentation de Microsoft indique que timestamp est le synonyme de rowversion , au moment d'écrire ces lignes, créer une colonne en tant que rowversion sur mon système SQL Server 2017 le fait apparaître comme un horodatage colonne. Si je regarde le type une fois la colonne créée, elle s'affiche sous la forme d'une colonne d'horodatage.

SELECT 
  OBJECT_NAME(object_id) AS [Table],
  name AS [Column],
  TYPE_NAME(system_type_id) AS [Type]
FROM sys.columns
WHERE OBJECT_NAME(object_id) = 'Owner';

Résultat :

+---------+------------+-----------+
| Table   | Column     | Type      |
|---------+------------+-----------|
| Owner   | OwnerId    | int       |
| Owner   | OwnerName  | varchar   |
| Owner   | RowVersion | timestamp |
+---------+------------+-----------+

Exemple 3 – Tableaux sans colonne TIMESTAMP

Voici ce qui se passe lorsque la table n'a pas d'horodatage colonne.

USE WideWorldImportersDW;
SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasTimestamp') AS [TableHasTimestamp];

Résultat :

+---------------------+
| TableHasTimestamp   |
|---------------------|
| 0                   |
+---------------------+

Dans ce cas, l'objet est une table mais il n'a pas d'horodatage colonne.

Exemple 4 - Lorsque l'objet n'est pas une table

Voici ce qui se passe lorsque la base de données contient un objet avec l'ID, mais que cet objet n'est même pas une table.

SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasTimestamp') AS [TableHasTimestamp];

Résultat :

+---------------------+
| TableHasTimestamp   |
|---------------------|
| NULL                |
+---------------------+

Exemple 5 - L'objet n'existe pas

SQL Server suppose que l'ID d'objet se trouve dans le contexte de base de données actuel. Si vous transmettez un ID d'objet d'une autre base de données, vous obtiendrez soit un résultat NULL, soit des résultats incorrects.

SELECT 
  OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasTimestamp') AS [InvalidObject],
  OBJECTPROPERTY(12345678, 'TableHasTimestamp') AS [12345678];

Résultat :

+-----------------+------------+
| InvalidObject   | 12345678   |
|-----------------+------------|
| NULL            | NULL       |
+-----------------+------------+

Dans ce cas, la base de données ne contient aucun objet de ce nom ou ID, et j'obtiens donc un résultat NULL.

Vous obtiendrez également NULL en cas d'erreur ou si vous n'êtes pas autorisé à afficher l'objet.