¿Hay alguna forma de recuperar la definición de vista de un SQL Server usando ADO simple?

89

Estoy extrayendo con éxito definiciones de columna de bases de datos alojadas en un servidor SQL utilizando la OpenSchema()llamada de conexión ADO en sus diversas encarnaciones para poder recrear esas tablas mediante programación en otra base de datos SQL. Hasta ahora tan bueno.

La interacción principal con las tablas anteriores ocurre usando múltiples vistas; si bien OpenSchema()puede devolver las definiciones de columna para la vista de la misma manera que devuelve las definiciones de columna para una tabla, falta un poco de información crucial: a qué tabla y columna de las tablas subyacentes se asigna la columna de la vista.

Intenté acceder al comando SQL utilizado para crear la vista usando Vistas de catálogo ADOX, pero parece que el controlador OLEDB para SQL Server que estamos usando no admite esta funcionalidad.

¿Hay alguna forma de obtener esta información para la configuración de la vista a través de ADO, ya sea de una manera que indique "ColumnX se asigna a ColumnY en la tabla Z" o en la forma del comando SQL real utilizado para crear la vista?

Timo Geusch
fuente

Respuestas:

160

¿Qué versión de SQL Server?

Para SQL Server 2005 y versiones posteriores, puede obtener el script SQL utilizado para crear la vista de esta manera:

select definition
from sys.objects     o
join sys.sql_modules m on m.object_id = o.object_id
where o.object_id = object_id( 'dbo.MyView')
  and o.type      = 'V'

Esto devuelve una sola fila que contiene el script utilizado para crear / modificar la vista.

Otras columnas de la tabla informan sobre las opciones existentes en el momento en que se compiló la vista.

Advertencias

  • Si la vista se modificó por última vez con ALTER VIEW, el script será una instrucción ALTER VIEW en lugar de una instrucción CREATE VIEW.

  • El guión refleja el nombre tal como fue creado. La única vez que se actualiza es si ejecuta ALTER VIEW, o suelta y vuelve a crear la vista con CREATE VIEW. Si se ha cambiado el nombre de la vista (por ejemplo, a través de sp_rename) o se ha transferido la propiedad a un esquema diferente, la secuencia de comandos que obtenga reflejará la declaración CREATE / ALTER VIEW original: no reflejará el nombre actual del objeto.

  • Algunas herramientas truncan la salida. Por ejemplo, la herramienta de línea de comandos de MS-SQL sqlcmd.exe trunca los datos en 255 caracteres. Puede pasar el parámetro -y Npara obtener el resultado con Ncaracteres.

Nicolás Carey
fuente
8
La consulta SQL de la respuesta se puede simplificar un poco:select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
Ivan
9
otra advertencia es que probablemente necesite los permisos adecuados para poder ver la definición. Obtengo NULL para ellos.
rveach
1
@schlamar, si todo lo que ve son los primeros 255 caracteres, está convirtiendo la columna de resultados de forma incorrecta. El esquema para sys.sql_modulesdefine la columna así:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
Nicholas Carey
1
@schlamar, también puede tener en cuenta que si está utilizando SSMS / Query Analyzer, si está ejecutando los resultados de la consulta como texto (en lugar de una cuadrícula), de forma predeterminada, los [n][var]chardatos se truncan a 256 caracteres. Puede cambiar eso a través del menú en Query..Query Options...& mdash; Desde el siguiente cuadro de diálogo modal, profundice en el Results>Textnodo en el control de árbol en el lado izquierdo.
Nicholas Carey
1
Utilizo la herramienta de línea de comandos MS-SQL (sqlcmd.exe). También trunca los datos. Tuve que pasar el parámetro -y N para obtener más datos (¿realmente MS?). Así que gracias por señalarme en la dirección correcta.
schlamar
24

Microsoft enumeró los siguientes métodos para obtener la definición de una vista: http://technet.microsoft.com/en-us/library/ms175067.aspx


USE AdventureWorks2012;
GO
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('HumanResources.vEmployee'); 
GO

USE AdventureWorks2012; 
GO
SELECT OBJECT_DEFINITION (OBJECT_ID('HumanResources.vEmployee')) 
AS ObjectDefinition; 
GO

EXEC sp_helptext 'HumanResources.vEmployee';
DaveAlger
fuente
12

Para los usuarios de SQL 2000, el comando real que proporcionará esta información es:

select c.text
from sysobjects     o
join syscomments    c on c.id = o.id
where o.name = '<view_name_here>'
  and o.type      = 'V'
TravelinGuy
fuente
Esta versión devuelve la Vista dividida en varios registros de 4.000 caracteres cada uno. (Probado en SQL Server 2014.)
Ben
7
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))
STiAT
fuente
3

Puede obtener detalles de la tabla / ver a través de la siguiente consulta.

Para la tabla: sp_help table_name Para la vista: sp_help view_name

vkstream
fuente
0
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID('your View Name');  
Bosco Han
fuente