Questo articolo presenta 4 modi per utilizzare T-SQL per ottenere la definizione di una vista in SQL Server.
La definizione della vista è l'effettiva istruzione T-SQL utilizzata per creare la vista.
Esempio 1 – La vista del catalogo di sistema sys.sql_modules
I sys.sql_modules
la visualizzazione del catalogo di sistema restituisce una riga per ogni oggetto che è un modulo definito dal linguaggio SQL in SQL Server.
In altre parole, puoi utilizzare questa vista per restituire informazioni su oggetti di vario tipo, incluse funzioni, procedure memorizzate e, naturalmente, viste.
Una delle colonne restituite con questa vista è chiamata definition
. Come suggerisce il nome, restituisce la definizione dell'oggetto.
SELECT definition FROM sys.sql_modules WHERE object_id = object_id('Website.Customers');
Risultato:
+--------------+ | definition | |--------------| | CREATE VIEW Website.Customers AS SELECT s.CustomerID, s.CustomerName, sc.CustomerCategoryName, pp.FullName AS PrimaryContact, ap.FullName AS AlternateContact, s.PhoneNumber, s.FaxNumber, bg.BuyingGroupName, s.WebsiteURL, dm.DeliveryMethodName AS DeliveryMethod, c.CityName AS CityName, s.DeliveryLocation AS DeliveryLocation, s.DeliveryRun, s.RunPosition FROM Sales.Customers AS s LEFT OUTER JOIN Sales.CustomerCategories AS sc ON s.CustomerCategoryID = sc.CustomerCategoryID LEFT OUTER JOIN [Application].People AS pp ON s.PrimaryContactPersonID = pp.PersonID LEFT OUTER JOIN [Application].People AS ap ON s.AlternateContactPersonID = ap.PersonID LEFT OUTER JOIN Sales.BuyingGroups AS bg ON s.BuyingGroupID = bg.BuyingGroupID LEFT OUTER JOIN [Application].DeliveryMethods AS dm ON s.DeliveryMethodID = dm.DeliveryMethodID LEFT OUTER JOIN [Application].Cities AS c ON s.DeliveryCityID = c.CityID | +--------------+ (1 row affected)
Ho usato un'interfaccia a riga di comando (CLI) con questo esempio, quindi il risultato è ben formattato.
Se si usa una GUI (come SSMS o Azure Data Studio) per restituire i risultati in una griglia, è probabile che la definizione venga restituita in una riga lunga in una singola cella. In questi casi dovrai fare del lavoro extra se vuoi che venga visualizzato in un formato più leggibile. In alternativa, puoi usare il sp_helptext
metodo di seguito.
Esempio 2:la stored procedure di sistema sp_helptext
Un altro metodo per restituire la definizione di una vista consiste nell'usare sp_helptext
procedura memorizzata di sistema. Oltre a restituire la definizione per una vista, può anche restituire la definizione di una regola definita dall'utente, una stored procedure T-SQL predefinita non crittografata, una funzione Transact-SQL definita dall'utente, un trigger, una colonna calcolata, CHECK
vincolo o un oggetto di sistema come una procedura memorizzata di sistema.
Come accennato nell'esempio precedente, questa stored procedure visualizza la definizione della vista su più righe. Ogni riga contiene 255 caratteri della definizione T-SQL.
Esempio:
EXEC sp_helptext 'Website.Customers';
Ecco il risultato che ottengo quando utilizzo una GUI (Azure Data Studio):
Ed ecco cosa ottengo usando la mia interfaccia a riga di comando:
+--------+ | Text | |--------| | | | CREATE VIEW Website.Customers | | AS | | SELECT s.CustomerID, | | s.CustomerName, | | sc.CustomerCategoryName, | | pp.FullName AS PrimaryContact, | | ap.FullName AS AlternateContact, | | s.PhoneNumber, | | s.FaxNumber, | | bg.BuyingGroupName, | | s.WebsiteURL, | | dm.DeliveryMethodName AS DeliveryMethod, | | c.CityName AS CityName, | | s.DeliveryLocation AS DeliveryLocation, | | s.DeliveryRun, | | s.RunPosition | | FROM Sales.Customers AS s | | LEFT OUTER JOIN Sales.CustomerCategories AS sc | | ON s.CustomerCategoryID = sc.CustomerCategoryID | | LEFT OUTER JOIN [Application].People AS pp | | ON s.PrimaryContactPersonID = pp.PersonID | | LEFT OUTER JOIN [Application].People AS ap | | ON s.AlternateContactPersonID = ap.PersonID | | LEFT OUTER JOIN Sales.BuyingGroups AS bg | | ON s.BuyingGroupID = bg.BuyingGroupID | | LEFT OUTER JOIN [Application].DeliveryMethods AS dm | | ON s.DeliveryMethodID = dm.DeliveryMethodID | | LEFT OUTER JOIN [Application].Cities AS c | | ON s.DeliveryCityID = c.CityID | +--------+
Questa volta i risultati sembrano migliori quando si utilizza la GUI.
Esempio 3 – La funzione OBJECT_DEFINITION()
Un altro modo per restituire la definizione di una vista è utilizzare OBJECT_DEFINITION()
funzione. Come con i metodi precedenti, anche questo metodo può restituire la definizione di altri tipi di oggetti.
Ecco un esempio di utilizzo di questa funzione:
SELECT OBJECT_DEFINITION( OBJECT_ID('Website.Customers') ) AS [Definition];
Risultato:
+--------------+ | Definition | |--------------| | CREATE VIEW Website.Customers AS SELECT s.CustomerID, s.CustomerName, sc.CustomerCategoryName, pp.FullName AS PrimaryContact, ap.FullName AS AlternateContact, s.PhoneNumber, s.FaxNumber, bg.BuyingGroupName, s.WebsiteURL, dm.DeliveryMethodName AS DeliveryMethod, c.CityName AS CityName, s.DeliveryLocation AS DeliveryLocation, s.DeliveryRun, s.RunPosition FROM Sales.Customers AS s LEFT OUTER JOIN Sales.CustomerCategories AS sc ON s.CustomerCategoryID = sc.CustomerCategoryID LEFT OUTER JOIN [Application].People AS pp ON s.PrimaryContactPersonID = pp.PersonID LEFT OUTER JOIN [Application].People AS ap ON s.AlternateContactPersonID = ap.PersonID LEFT OUTER JOIN Sales.BuyingGroups AS bg ON s.BuyingGroupID = bg.BuyingGroupID LEFT OUTER JOIN [Application].DeliveryMethods AS dm ON s.DeliveryMethodID = dm.DeliveryMethodID LEFT OUTER JOIN [Application].Cities AS c ON s.DeliveryCityID = c.CityID | +--------------+
Questa volta è più facile leggere nella mia CLI che nella mia griglia della GUI.
Esempio 4 – Visualizzazione dello schema delle informazioni di sistema VIEWS
Le VIEWS
La vista dello schema delle informazioni di sistema può anche restituire la definizione di una vista. Una differenza tra questo metodo e i precedenti è che VIEWS
la visualizzazione dello schema di informazioni è limitata alle sole visualizzazioni (come suggerisce il nome).
Restituisce un gruppo di colonne, una delle quali è la definizione della vista. Pertanto possiamo nominare quella colonna per restituire solo la definizione:
SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'Customers';
Risultato:
+-------------------+ | VIEW_DEFINITION | |-------------------| | CREATE VIEW Website.Customers AS SELECT s.CustomerID, s.CustomerName, sc.CustomerCategoryName, pp.FullName AS PrimaryContact, ap.FullName AS AlternateContact, s.PhoneNumber, s.FaxNumber, bg.BuyingGroupName, s.WebsiteURL, dm.DeliveryMethodName AS DeliveryMethod, c.CityName AS CityName, s.DeliveryLocation AS DeliveryLocation, s.DeliveryRun, s.RunPosition FROM Sales.Customers AS s LEFT OUTER JOIN Sales.CustomerCategories AS sc ON s.CustomerCategoryID = sc.CustomerCategoryID LEFT OUTER JOIN [Application].People AS pp ON s.PrimaryContactPersonID = pp.PersonID LEFT OUTER JOIN [Application].People AS ap ON s.AlternateContactPersonID = ap.PersonID LEFT OUTER JOIN Sales.BuyingGroups AS bg ON s.BuyingGroupID = bg.BuyingGroupID LEFT OUTER JOIN [Application].DeliveryMethods AS dm ON s.DeliveryMethodID = dm.DeliveryMethodID LEFT OUTER JOIN [Application].Cities AS c ON s.DeliveryCityID = c.CityID | +-------------------+
Nota che il VIEW_DEFINITION
la colonna in questa vista di sistema ha una lunghezza massima di nvarchar(4000) . Per definizioni di viste più grandi di questa, puoi usare OBJECT_DEFINITION()
funzione nell'esempio precedente.
Il valore restituito di OBJECT_DEFINITION()
la funzione è nvarchar(max) , quindi non ha il limite di caratteri di VIEW_DEFINITION
colonna (che, come accennato, è nvarchar(4000) ).