Den här artikeln presenterar fyra sätt att använda T-SQL för att få definitionen av en vy i SQL Server.
Vydefinitionen är den faktiska T-SQL-satsen som används för att skapa vyn.
Exempel 1 – Sys.sql_modules systemkatalogvy
sys.sql_modules
systemkatalogvyn returnerar en rad för varje objekt som är en SQL-språkdefinierad modul i SQL Server.
Med andra ord kan du använda denna vy för att returnera information om objekt av olika typer, inklusive funktioner, lagrade procedurer och naturligtvis vyer.
En av kolumnerna som returneras med denna vy kallas definition
. Som namnet antyder returnerar detta definitionen av objektet.
SELECT definition FROM sys.sql_modules WHERE object_id = object_id('Website.Customers');
Resultat:
+--------------+ | 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)
Jag använde ett kommandoradsgränssnitt (CLI) med det här exemplet, så resultatet är snyggt formaterat.
Om du använder ett GUI (som SSMS eller Azure Data Studio) för att returnera resultaten i ett rutnät, kommer definitionen troligen att returneras i en lång rad i en enda cell. I sådana fall måste du göra lite extra arbete om du vill att det ska visas i ett mer läsbart format. Alternativt kan du använda sp_helptext
metod nedan.
Exempel 2 – Sp_helptext-systemets lagrade procedur
En annan metod för att returnera en vys definition är att använda sp_hjälptext
systemlagrad procedur. Förutom att returnera definitionen för en vy, kan den också returnera definitionen av en användardefinierad regel, standard, okrypterad T-SQL lagrad procedur, användardefinierad Transact-SQL funktion, trigger, beräknad kolumn, CHECK begränsning, eller systemobjekt såsom en systemlagrad procedur.
Som nämnts i föregående exempel visar denna lagrade procedur vyns definition över flera rader. Varje rad innehåller 255 tecken i T-SQL-definitionen.
Exempel:
EXEC sp_helptext 'Website.Customers';
Här är resultatet jag får när jag använder ett GUI (Azure Data Studio):
Och här är vad jag får med mitt kommandoradsgränssnitt:
+--------+ | 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 | +--------+
Den här gången ser resultaten bättre ut när du använder GUI.
Exempel 3 – OBJECT_DEFINITION()-funktionen
Ett annat sätt att returnera en vys definition är att använda OBJECT_DEFINITION()
fungera. Som med de tidigare metoderna kan denna metod även returnera definitionen av andra objekttyper.
Här är ett exempel på hur du använder den här funktionen:
SELECT OBJECT_DEFINITION( OBJECT_ID('Website.Customers') ) AS [Definition];
Resultat:
+--------------+ | 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 | +--------------+
Den här gången är det lättare att läsa i min CLI än mitt GUI-rutnät.
Exempel 4 – Systeminformationsschemavyn för VIEWS
VISNINGAR
systeminformationsschemavy kan också returnera en vys definition. En skillnad mellan den här metoden och de tidigare är att VIEWS
informationsschemavyn är begränsad till bara vyer (som namnet antyder).
Det returnerar ett gäng kolumner, varav en är vyns definition. Därför kan vi namnge den kolumnen för att bara returnera definitionen:
SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'Customers';
Resultat:
+-------------------+ | 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 | +-------------------+
Observera att VIEW_DEFINITION
kolumnen i denna systemvy har en maximal längd på nvarchar(4000) . För vydefinitioner större än detta kan du använda OBJECT_DEFINITION()
funktion i föregående exempel.
Returvärdet för OBJECT_DEFINITION()
funktionen är nvarchar(max) , så den har inte teckenbegränsningen för VIEW_DEFINITION
kolumn (som som nämnts är nvarchar(4000) ).