sql >> Databasteknik >  >> RDS >> Sqlserver

Ta reda på om ett objekt är en användardefinierad tabell i SQL Server med OBJECTPROPERTY()

Du kan använda OBJECTPROPERTY() funktion i SQL Server för att kontrollera om ett objekt är en användardefinierad tabell eller inte.

För att göra detta, skicka objekt-ID som det första argumentet och IsUserTable som det andra argumentet. Funktionen returnerar en 1 eller en 0 beroende på om det är en användardefinierad tabell eller inte.

Ett returvärde på 1 betyder att det är en användardefinierad tabell och ett värde på 0 betyder att det inte är det.

Exempel 1 – Grundläggande användning

Här är ett snabbt exempel att visa.

USE WideWorldImportersDW;
SELECT OBJECTPROPERTY(1013578649, 'IsUserTable') AS [IsUserTable];

Resultat:

+---------------+
| IsUserTable   |
|---------------|
| 1             |
+---------------+

I det här fallet, WideWorldImportersDW databasen har ett objekt med det angivna ID, och det är en användardefinierad tabell.

Exempel 2 – Hämta objekt-ID

Om du känner till objektets namn, men inte dess ID, kan du använda OBJECT_ID() funktion för att hämta ID baserat på dess namn.

Exempel:

SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsUserTable') AS [IsUserTable];

Resultat:

+---------------+
| IsUserTable   |
|---------------|
| 1             |
+---------------+

Detta är samma objekt från föregående exempel.

Här är den igen med ID-utgången separat.

SELECT 
  OBJECT_ID('Dimension.City') AS [Object ID],
  OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsUserTable') AS [IsUserTable];

Resultat:

+-------------+---------------+
| Object ID   | IsUserTable   |
|-------------+---------------|
| 1013578649  | 1             |
+-------------+---------------+

Exempel 3 – När objektet INTE är en användardefinierad tabell

Här är vad som händer när objektet inte är en användartabell.

SELECT OBJECTPROPERTY(402100473, 'IsUserTable') AS [IsUserTable];

Resultat:

+---------------+
| IsUserTable   |
|---------------|
| 0             |
+---------------+

I det här fallet gör det databasen har ett objekt med det ID, men objektet är faktiskt en lagrad procedur (inte en användardefinierad tabell), så jag får ett negativt resultat.

Här använder den återigen OBJECT_ID() .

SELECT 
  OBJECT_ID('Sequences.ReseedAllSequences') AS [Object ID],
  OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'IsUserTable') AS [IsUserTable],
  OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'IsProcedure') AS [IsProcedure];

Resultat:

+-------------+---------------+---------------+
| Object ID   | IsUserTable   | IsProcedure   |
|-------------+---------------+---------------|
| 402100473   | 0             | 1             |
+-------------+---------------+---------------+

Jag kollade också för att se om objektet är en lagrad procedur, och resultatet är positivt.

Exempel 4 – Objekt existerar inte

SQL Server antar att objekt-ID:t finns i den aktuella databaskontexten. Om du skickar in ett objekt-ID från en annan databas får du antingen ett NULL-resultat eller så får du felaktiga resultat.

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

Resultat:

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

I det här fallet innehåller databasen inga objekt med det namnet eller ID, så jag får ett NULL-resultat.

Du får också NULL vid fel eller om du inte har behörighet att visa objektet.


  1. Biblioteket har inte laddats:libmysqlclient.16.dylib fel vid försök att köra 'rails server' på OS X 10.6 med mysql2 gem

  2. Optimerad SQL för trädstrukturer

  3. node.js mysql-fel:ECONNREFUSED

  4. På uppgraderingsmetoden anropas inte i android sqlite