sql >> Base de Datos >  >> RDS >> Sqlserver

Compruebe si una tabla tiene una columna TIMESTAMP en SQL Server con OBJECTPROPERTY()

Puede usar OBJECTPROPERTY() función en SQL Server para verificar si una tabla tiene o no una marca de tiempo columna.

Para hacer esto, pase el ID del objeto de la tabla como primer argumento y TableHasTimestamp como segundo argumento. La función devuelve un 1 o un 0 dependiendo de si tiene o no una marca de tiempo columna.

Un valor de retorno de 1 significa que la tabla tener una marca de tiempo columna y un valor de 0 significa que no.

Esto también funciona para columnas que se han definido como rowversion (marca de tiempo es el sinónimo obsoleto de rowversion ).

Ejemplo 1:una columna de marca de tiempo

Aquí hay un ejemplo rápido para demostrar en una tabla con una marca de tiempo columna.

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

Resultado:

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

En este caso, el Test_timestamp la base de datos tiene una tabla con el ID proporcionado y tiene una marca de tiempo columna.

Uso el OBJECT_ID() función para recuperar el ID de la tabla en función de su nombre.

Ejemplo 2:una columna de versión de fila

Como se mencionó, este método también funciona si ha usado rowversion para definir la columna.

Por ejemplo, si creo una tabla de la siguiente manera:

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

Y luego ejecútalo:

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

Resultado:

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

Me doy cuenta de que, aunque la documentación de Microsoft establece que timestamp es el sinónimo de rowversion , a partir de este escrito, creando una columna como rowversion en mi sistema SQL Server 2017 en realidad aparece como una marca de tiempo columna. Si observo el tipo después de crear la columna, se muestra como una columna de marca de tiempo.

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';

Resultado:

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

Ejemplo 3:tablas sin una columna TIMESTAMP

Esto es lo que sucede cuando la tabla no tiene una marca de tiempo columna.

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

Resultado:

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

En este caso, el objeto es una tabla pero no tiene una marca de tiempo columna.

Ejemplo 4:cuando el objeto no es una tabla

Esto es lo que sucede cuando la base de datos contiene un objeto con la ID, pero ese objeto ni siquiera es una tabla.

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

Resultado:

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

Ejemplo 5:el objeto no existe

SQL Server asume que el ID del objeto está en el contexto de la base de datos actual. Si pasa un ID de objeto de una base de datos diferente, obtendrá un resultado NULO o obtendrá resultados incorrectos.

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

Resultado:

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

En este caso, la base de datos no contiene objetos con ese nombre o ID, por lo que obtengo un resultado NULL.

También obtendrá NULL en caso de error o si no tiene permiso para ver el objeto.