Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Verifique se uma tabela tem uma coluna TIMESTAMP no SQL Server com OBJECTPROPERTY()


Você pode usar o OBJECTPROPERTY() função no SQL Server para verificar se uma tabela tem ou não um timestamp coluna.

Para fazer isso, passe o ID do objeto da tabela como o primeiro argumento e TableHasTimestamp como segundo argumento. A função retorna um 1 ou um 0 dependendo se tem ou não um timestamp coluna.

Um valor de retorno de 1 significa que a tabela faz ter um carimbo de data e hora coluna e um valor de 0 significa que não.

Isso também funciona para colunas que foram definidas como rowversion (carimbo de data e hora é o sinônimo obsoleto de rowversion ).


Exemplo 1 – Uma coluna de carimbo de data/hora


Aqui está um exemplo rápido para demonstrar em uma tabela com um timestamp coluna.
USE Test_timestamp;
SELECT OBJECTPROPERTY(OBJECT_ID('Pet'), 'TableHasTimestamp') AS [TableHasTimestamp];

Resultado:
+---------------------+
| TableHasTimestamp   |
|---------------------|
| 1                   |
+---------------------+

Nesse caso, o Test_timestamp banco de dados tem uma tabela com o ID fornecido e tem um timestamp coluna.

Eu uso o OBJECT_ID() função para recuperar o ID da tabela com base em seu nome.

Exemplo 2 – Uma coluna de versão de linha


Como mencionado, esse método também funciona se você usou rowversion para definir a coluna.

Por exemplo, se eu criar uma tabela da seguinte forma:
CREATE TABLE Owner (
  OwnerId int PRIMARY KEY, 
  OwnerName varchar(255), 
  RowVersion rowversion
  );

E, em seguida, execute uma verificação sobre isso:
SELECT OBJECTPROPERTY(OBJECT_ID('Owner'), 'TableHasTimestamp') AS [TableHasTimestamp];

Resultado:
+---------------------+
| TableHasTimestamp   |
|---------------------|
| 1                   |
+---------------------+

Percebo que, embora a documentação da Microsoft afirme que timestamp é o sinônimo de rowversion , no momento da redação deste artigo, criando uma coluna como rowversion no meu sistema SQL Server 2017, na verdade, faz com que apareça como um timestamp coluna. Se eu observar o tipo após a criação da coluna, ela será exibida como uma coluna de carimbo de data/hora.
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 |
+---------+------------+-----------+

Exemplo 3 – Tabelas sem coluna TIMESTAMP


Veja o que acontece quando a tabela não tem um timestamp coluna.
USE WideWorldImportersDW;
SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasTimestamp') AS [TableHasTimestamp];

Resultado:
+---------------------+
| TableHasTimestamp   |
|---------------------|
| 0                   |
+---------------------+

Nesse caso, o objeto é uma tabela, mas não tem um timestamp coluna.

Exemplo 4 – Quando o objeto não é uma tabela


Aqui está o que acontece quando o banco de dados contém um objeto com o ID, mas esse objeto nem é uma tabela.
SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasTimestamp') AS [TableHasTimestamp];

Resultado:
+---------------------+
| TableHasTimestamp   |
|---------------------|
| NULL                |
+---------------------+

Exemplo 5 – O objeto não existe


O SQL Server pressupõe que a identificação do objeto está no contexto do banco de dados atual. Se você passar um ID de objeto de um banco de dados diferente, obterá um resultado NULL ou obterá resultados incorretos.
SELECT 
  OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasTimestamp') AS [InvalidObject],
  OBJECTPROPERTY(12345678, 'TableHasTimestamp') AS [12345678];

Resultado:
+-----------------+------------+
| InvalidObject   | 12345678   |
|-----------------+------------|
| NULL            | NULL       |
+-----------------+------------+

Nesse caso, o banco de dados não contém objetos com esse nome ou ID e, portanto, obtenho um resultado NULL.

Você também receberá NULL em caso de erro ou se não tiver permissão para visualizar o objeto.