sql >> Base de Datos >  >> RDS >> Database

4 formas de obtener la definición de una vista usando Transact-SQL

Este artículo presenta 4 formas de usar T-SQL para obtener la definición de una vista en SQL Server.

La definición de la vista es la instrucción T-SQL real utilizada para crear la vista.

Ejemplo 1:la vista de catálogo del sistema sys.sql_modules

Los sys.sql_modules la vista de catálogo del sistema devuelve una fila para cada objeto que es un módulo definido en lenguaje SQL en SQL Server.

En otras palabras, puede usar esta vista para devolver información sobre objetos de varios tipos, incluidas funciones, procedimientos almacenados y, por supuesto, vistas.

Una de las columnas devueltas con esta vista se llama definition . Como su nombre lo indica, esto devuelve la definición del objeto.

SELECT definition
FROM sys.sql_modules
WHERE object_id = object_id('Website.Customers');

Resultado:

+--------------+
| 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)

Usé una interfaz de línea de comandos (CLI) con este ejemplo, por lo que el resultado está bien formateado.

Si usa una GUI (como SSMS o Azure Data Studio) para devolver los resultados en una cuadrícula, es probable que la definición se devuelva en una línea larga en una sola celda. En tales casos, deberá hacer un trabajo adicional si desea que se muestre en un formato más legible. Alternativamente, podría usar el sp_helptext método a continuación.

Ejemplo 2:el procedimiento almacenado del sistema sp_helptext

Otro método para devolver la definición de una vista es usar el sp_helptext procedimiento almacenado del sistema. Además de devolver la definición de una vista, también puede devolver la definición de una regla definida por el usuario, un procedimiento almacenado T-SQL sin cifrar predeterminado, una función Transact-SQL definida por el usuario, un activador, una columna calculada, CHECK restricción u objeto del sistema, como un procedimiento almacenado del sistema.

Como se mencionó en el ejemplo anterior, este procedimiento almacenado muestra la definición de la vista en varias filas. Cada fila contiene 255 caracteres de la definición de T-SQL.

Ejemplo:

EXEC sp_helptext 'Website.Customers';

Este es el resultado que obtengo cuando uso una GUI (Azure Data Studio):

Y esto es lo que obtengo usando mi interfaz de línea de comandos:

+--------+
| 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
        |
+--------+

Esta vez, los resultados se ven mejor cuando se usa la GUI.

Ejemplo 3:la función OBJECT_DEFINITION()

Otra forma de devolver la definición de una vista es usar OBJECT_DEFINITION() función. Al igual que con los métodos anteriores, este método también puede devolver la definición de otros tipos de objetos.

Aquí hay un ejemplo del uso de esta función:

SELECT OBJECT_DEFINITION(
        OBJECT_ID('Website.Customers')
    ) AS [Definition];

Resultado:

+--------------+
| 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
              |
+--------------+

Esta vez es más fácil de leer en mi CLI que en mi cuadrícula GUI.

Ejemplo 4:la vista de esquema de información del sistema VIEWS

Las VIEWS La vista de esquema de información del sistema también puede devolver la definición de una vista. Una diferencia entre este método y los anteriores es que las VIEWS la vista del esquema de información está limitada a solo vistas (como su nombre lo indica).

Devuelve un montón de columnas, una de las cuales es la definición de la vista. Por lo tanto, podemos nombrar esa columna para devolver solo la definición:

SELECT VIEW_DEFINITION
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_NAME = 'Customers';

Resultado:

+-------------------+
| 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
                   |
+-------------------+

Tenga en cuenta que VIEW_DEFINITION columna en esta vista del sistema tiene una longitud máxima de nvarchar(4000) . Para ver definiciones más grandes que esta, puede usar OBJECT_DEFINITION() función en el ejemplo anterior.

El valor de retorno de OBJECT_DEFINITION() la función es nvarchar(max) , por lo que no tiene la limitación de caracteres de VIEW_DEFINITION columna (que, como se mencionó, es nvarchar(4000) ).