W tym artykule przedstawiono 4 sposoby wykorzystania T-SQL do uzyskania definicji widoku w SQL Server.
Definicja widoku to rzeczywista instrukcja T-SQL używana do tworzenia widoku.
Przykład 1 – Widok katalogu systemu sys.sql_modules
sys.sql_modules
widok katalogu systemowego zwraca wiersz dla każdego obiektu, który jest modułem zdefiniowanym w języku SQL w SQL Server.
Innymi słowy, możesz użyć tego widoku do zwrócenia informacji o obiektach różnych typów, w tym o funkcjach, procedurach składowanych i oczywiście widokach.
Jedna z kolumn zwracanych z tym widokiem nazywa się definicja
. Jak sama nazwa wskazuje, zwraca definicję obiektu.
SELECT definition FROM sys.sql_modules WHERE object_id = object_id('Website.Customers');
Wynik:
+--------------+ | 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)
W tym przykładzie użyłem interfejsu wiersza poleceń (CLI), więc wynik jest dobrze sformatowany.
Jeśli używasz graficznego interfejsu użytkownika (takiego jak SSMS lub Azure Data Studio), aby zwrócić wyniki w siatce, definicja prawdopodobnie zostanie zwrócona w jednym długim wierszu w jednej komórce. W takich przypadkach będziesz musiał wykonać dodatkową pracę, jeśli chcesz, aby wyświetlał się w bardziej czytelnym formacie. Alternatywnie możesz użyć sp_helptext
metoda poniżej.
Przykład 2 – Procedura przechowywana w systemie sp_helptext
Inną metodą zwracania definicji widoku jest użycie sp_helptext
systemowa procedura składowana. Oprócz zwrócenia definicji widoku może również zwrócić definicję reguły zdefiniowanej przez użytkownika, domyślnej, niezaszyfrowanej procedury składowanej T-SQL, zdefiniowanej przez użytkownika funkcji Transact-SQL, wyzwalacza, kolumny wyliczanej, SPRAWDZ ograniczenie lub obiekt systemowy, taki jak systemowa procedura składowana.
Jak wspomniano w poprzednim przykładzie, ta procedura składowana wyświetla definicję widoku w wielu wierszach. Każdy wiersz zawiera 255 znaków definicji T-SQL.
Przykład:
EXEC sp_helptext 'Website.Customers';
Oto wynik, który otrzymuję podczas korzystania z GUI (Azure Data Studio):
A oto, co otrzymuję za pomocą interfejsu wiersza poleceń:
+--------+ | 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 | +--------+
Tym razem wyniki wyglądają lepiej podczas korzystania z GUI.
Przykład 3 – Funkcja OBJECT_DEFINITION()
Innym sposobem na zwrócenie definicji widoku jest użycie OBJECT_DEFINITION()
funkcjonować. Podobnie jak w przypadku poprzednich metod, ta metoda może również zwrócić definicję innych typów obiektów.
Oto przykład użycia tej funkcji:
SELECT OBJECT_DEFINITION( OBJECT_ID('Website.Customers') ) AS [Definition];
Wynik:
+--------------+ | 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 | +--------------+
Tym razem łatwiej jest czytać w moim CLI niż w siatce GUI.
Przykład 4 – Widok schematu informacji o systemie WIDOKÓW
WIDOKÓW
Widok schematu informacji o systemie może również zwracać definicję widoku. Jedną z różnic między tą metodą a poprzednimi jest to, że WIDOKÓW
Widok schematu informacji jest ograniczony tylko do widoków (jak sama nazwa wskazuje).
Zwraca kilka kolumn, z których jedna to definicja widoku. Dlatego możemy nazwać tę kolumnę, aby zwrócić tylko definicję:
SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'Customers';
Wynik:
+-------------------+ | 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 | +-------------------+
Zauważ, że VIEW_DEFINITION
kolumna w tym widoku systemowym ma maksymalną długość nvarchar(4000) . W przypadku definicji widoków większych niż ta, możesz użyć OBJECT_DEFINITION()
funkcji w poprzednim przykładzie.
Zwracana wartość OBJECT_DEFINITION()
funkcja to nvarchar(max) , więc nie ma ograniczenia znaków VIEW_DEFINITION
kolumna (która, jak wspomniano, to nvarchar(4000) ).