sql >> Databasteknik >  >> RDS >> Sqlserver

Returnera en lista över tabeller och vyer i SQL Server med T-SQL (sp_tables)

I SQL Server kan du använda sp_tables systemlagrad procedur för att få en lista över tabeller och vyer i den aktuella miljön.

Du kan returnera alla tabeller och vyer, eller så kan du begränsa dem till en viss ägare, typ, mönster eller till och med en specifik tabell eller vy.

Syntax

Syntaxen ser ut så här:

sp_tables [ [ @table_name = ] 'name' ]   
     [ , [ @table_owner = ] 'owner' ]   
     [ , [ @table_qualifier = ] 'qualifier' ]   
     [ , [ @table_type = ] "type" ]   
     [ , [@fUsePattern = ] 'fUsePattern'];

Alla argument är valfria.

Exempel 1 – Inga argument

Du kan köra denna lagrade procedur utan några argument. Om du gör detta returneras alla tabeller och vyer i den aktuella miljön.

Så här:

EXEC sp_tables;

Detta returnerar över 500 rader på mitt system, så jag kommer inte att ge resultaten här. Förutom att returnera användardefinierade tabeller och vyer, returnerar den också systemobjekt, såsom sys och INFORMATION_SCHEMA tabeller och vyer.

Exempel 2 – Alla argument

I den andra ytterligheten, här är ett exempel som inkluderar alla argument. Detta begränsar resultaten till ett specifikt tabellnamn, en specifik typ, en specifik kvalificering och en specifik ägare.

EXEC sp_tables
  @table_name = 'Customers',
  @table_owner = 'Sales',
  @table_qualifier = 'WideWorldImporters',
  @table_type = "'TABLE'",
  @fUsePattern = 1;

Resultat:

+--------------------+---------------+--------------+--------------+-----------+
| TABLE_QUALIFIER    | TABLE_OWNER   | TABLE_NAME   | TABLE_TYPE   | REMARKS   |
|--------------------+---------------+--------------+--------------+-----------|
| WideWorldImporters | Sales         | Customers    | TABLE        | NULL      |
+--------------------+---------------+--------------+--------------+-----------+

Exempel 3 – Returnera en specifik tabell

Ett enklare sätt att returnera en specifik tabell är att helt enkelt använda det första argumentet.

Så här:

EXEC sp_tables @table_name = 'Customers';

Eller ännu mer kortfattat, som en av dessa:

EXEC sp_tables 'Customers';
sp_tables 'Customers';

Tänk dock på att du kan få mer än en rad. I det här exemplet returneras två rader:

+--------------------+---------------+--------------+--------------+-----------+
| TABLE_QUALIFIER    | TABLE_OWNER   | TABLE_NAME   | TABLE_TYPE   | REMARKS   |
|--------------------+---------------+--------------+--------------+-----------|
| WideWorldImporters | Sales         | Customers    | TABLE        | NULL      |
| WideWorldImporters | Website       | Customers    | VIEW         | NULL      |
+--------------------+---------------+--------------+--------------+-----------+

Den första raden är för en tabell och den andra raden är för en vy.

Om jag inte var intresserad av att se några vyer eller systemtabeller kunde jag lägga till ytterligare ett argument för att specificera tabelltypen.

Exempel 4 – Returnera en specifik tabelltyp

Här förfinar jag det föregående exemplet genom att endast ange den tabelltyp som jag är intresserad av, tillsammans med tabellens namn.

EXEC sp_tables 
  @table_name = 'Customers',
  @table_type = "'TABLE'";

Resultat:

+--------------------+---------------+--------------+--------------+-----------+
| TABLE_QUALIFIER    | TABLE_OWNER   | TABLE_NAME   | TABLE_TYPE   | REMARKS   |
|--------------------+---------------+--------------+--------------+-----------|
| WideWorldImporters | Sales         | Customers    | TABLE        | NULL      |
+--------------------+---------------+--------------+--------------+-----------+

De acceptabla typerna inkluderar VIEW , TABLE och SYSTEMTABLE .

Observera att tabelltyper måste vara stora bokstäver.

Exempel 5 – Returnera flera tabelltyper

Du kanske har märkt att syntaxen för tabelltypen använder enkla citattecken och dubbla citattecken. Detta beror på att den accepterar en kommaseparerad lista med tabelltyper. Hela listan är omgiven av dubbla citattecken, och varje listobjekt är omsluten av enkla citattecken, med ett kommatecken som separerar varje post.

Här är ett exempel på returnerande tabelltyper TABLE och VIEW .

EXEC sp_tables 
  @table_type = "'TABLE','VIEW'";

Observera att om SET QUOTED_IDENTIFIER är ON , måste varje enskilt citattecken dubbleras och hela parametern måste omges av enkla citattecken.

Exempel 6 – En anmärkning om tabellkvalificeringsargumentet

Om du använder @table_qualifier argument måste dess värde vara detsamma som den aktuella miljön, annars får du ett fel. I SQL Server representerar tabellkvalificeraren databasnamnet. I vissa produkter representerar det servernamnet för tabellens databasmiljö.

Här är vad som händer i SQL Server om jag använder ett värde som skiljer sig från den aktuella databasen:

USE Music;
EXEC sp_tables 
  @table_qualifier = 'WideWorldImporters';

Resultat:

Msg 15250, Level 16, State 1, Procedure sp_tables, Line 86
The database name component of the object qualifier must be the name of the current database.

Exempel 7 – Jokertecken

Du kan använda @fUsePattern argument för att ange om understrecket ( _ ), procent ( % ), och parentes ( [ eller ] )-tecken tolkas som jokertecken. Giltiga värden är 0 (mönstermatchning är av) och 1 (mönstermatchning är på). Standardvärdet är 1 .

Här är ett exempel på hur man använder mönstermatchning för att returnera tabellnamn som börjar med bokstaven "A":

EXEC sp_tables
  @table_name = 'A%',
  @table_type = "'TABLE'",
  @fUsePattern = 1;

Resultat:

+-------------------+---------------+--------------+--------------+-----------+
| TABLE_QUALIFIER   | TABLE_OWNER   | TABLE_NAME   | TABLE_TYPE   | REMARKS   |
|-------------------+---------------+--------------+--------------+-----------|
| Music             | dbo           | Albums       | TABLE        | NULL      |
| Music             | dbo           | Artists      | TABLE        | NULL      |
+-------------------+---------------+--------------+--------------+-----------+

Men här är vad som händer om jag inaktiverar mönstermatchning:

EXEC sp_tables
  @table_name = 'A%',
  @table_type = "'TABLE'",
  @fUsePattern = 0;

Resultat:

(0 rows affected)

  1. Vad motsvarar Oracles REF CURSOR i MySQL när du använder JDBC?

  2. SQLSTATE[42000]:Syntaxfel eller åtkomstöverträdelse:1064 Du har ett fel i din SQL-syntax — PHP — PDO

  3. LAST_DAY() Funktion i Oracle

  4. MySQL COUNT DISTINKT