Denne artikel præsenterer 4 måder at bruge T-SQL til at få definitionen af en visning i SQL Server.
Visningsdefinitionen er den faktiske T-SQL-sætning, der bruges til at oprette visningen.
Eksempel 1 – Sys.sql_modules systemkatalogvisning
sys.sql_modules
systemkatalogvisning returnerer en række for hvert objekt, der er et SQL-sprogdefineret modul i SQL Server.
Med andre ord kan du bruge denne visning til at returnere information om objekter af forskellige typer, herunder funktioner, lagrede procedurer og selvfølgelig visninger.
En af kolonnerne, der returneres med denne visning, kaldes definition
. Som navnet antyder, returnerer dette objektets definition.
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)
Jeg brugte en kommandolinjegrænseflade (CLI) med dette eksempel, så resultatet er pænt formateret.
Hvis du bruger en GUI (såsom SSMS eller Azure Data Studio) til at returnere resultaterne i et gitter, vil definitionen sandsynligvis blive returneret i en lang linje i en enkelt celle. I sådanne tilfælde bliver du nødt til at gøre noget ekstra arbejde, hvis du vil have det vist i et mere læsbart format. Alternativt kan du bruge sp_helptext
metode nedenfor.
Eksempel 2 – Sp_helptext-systemets lagrede procedure
En anden metode til at returnere en visnings definition er at bruge sp_helptext
system lagret procedure. Ud over at returnere definitionen for en visning, kan den også returnere definitionen af en brugerdefineret regel, standard, ukrypteret T-SQL lagret procedure, brugerdefineret Transact-SQL funktion, trigger, beregnet kolonne, CHECK begrænsning eller systemobjekt såsom en systemlagret procedure.
Som nævnt i det foregående eksempel viser denne lagrede procedure visningens definition på tværs af flere rækker. Hver række indeholder 255 tegn i T-SQL-definitionen.
Eksempel:
EXEC sp_helptext 'Website.Customers';
Her er resultatet, jeg får, når jeg bruger en GUI (Azure Data Studio):
Og her er, hvad jeg får ved at bruge min kommandolinjegrænseflade:
+--------+ | 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 | +--------+
Denne gang ser resultaterne bedre ud, når du bruger GUI.
Eksempel 3 – OBJECT_DEFINITION()-funktionen
En anden måde at returnere en visnings definition på er at bruge OBJECT_DEFINITION()
fungere. Som med de tidligere metoder kan denne metode også returnere definitionen af andre objekttyper.
Her er et eksempel på brug af denne funktion:
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 | +--------------+
Denne gang er det nemmere at læse i mit CLI end mit GUI-gitter.
Eksempel 4 – VIEWS System Information Schema View
VIEWS
systeminformationsskemavisning kan også returnere en visnings definition. En forskel mellem denne metode og de tidligere er, at VIEWS
informationsskemavisning er begrænset til kun visninger (som navnet antyder).
Det returnerer en masse kolonner, hvoraf den ene er visningens definition. Derfor kan vi navngive den kolonne for kun at returnere 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 | +-------------------+
Bemærk, at VIEW_DEFINITION
kolonne i denne systemvisning har en maksimal længde på nvarchar(4000) . For visningsdefinitioner, der er større end dette, kan du bruge OBJECT_DEFINITION()
funktion i det foregående eksempel.
Returværdien for OBJECT_DEFINITION()
funktionen er nvarchar(max) , så den har ikke tegnbegrænsningen for VIEW_DEFINITION
kolonne (som som nævnt er nvarchar(4000) ).