2011-01-22 13 views
55

Estoy extrayendo con éxito definiciones de columnas de bases de datos alojadas en un servidor SQL utilizando la conexión ADO OpenSchema() llamada en sus diversas encarnaciones para que pueda recrear esas tablas programáticamente en otra base de datos SQL. Hasta aquí todo bien.¿Hay alguna manera de recuperar la definición de vista de un servidor SQL utilizando ADO simple?

La interacción principal con las tablas anteriores ocurre al usar vistas múltiples; mientras que 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 dato crucial: qué tabla y columna en las tablas subyacentes se asigna a la columna en la vista.

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

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

+0

documento este [mensaje] (https://stackoverflow.com/documentation/ado/commit) moviéndolo hacia atrás hacerlo ahora antes de que la documentación está [ido para siempre] (https: // meta .stackoverflow.com/questions/356294/removing-documentation-reputation-archive-and-links? cb = 1)! –

Respuesta

103

¿Qué versión de SQL Server?

Para SQL Server 2005 y versiones posteriores, se puede obtener la secuencia de comandos SQL que se utiliza 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 en la tabla hablan sobre las opciones vigentes en el momento en que se compiló la vista.

Advertencias

  • Si la vista fue modificada por última con ALTER VIEW, a continuación, el guión será una declaración VISTA ALTER en lugar de una declaración CREATE VIEW.

  • El script refleja el nombre tal como fue creado. La única vez que se actualiza es si ejecuta ALTER VIEW, o descarta y recrea la vista con CREATE VIEW. Si se ha cambiado el nombre de la vista (p. Ej., A través del sp_rename) o la propiedad se ha transferido a un esquema diferente, la secuencia de comandos que reciba reflejará la declaración original CREATE/ALTER VIEW: no reflejará el nombre actual de los objetos.

  • 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 N para obtener el resultado con N caracteres.

+0

En este caso, estamos tratando con SQL Server 2008, por lo que su enfoque debería funcionar. Voy a intentarlo, gracias! –

+0

En SQL 2000, (utilizando 'syscomments' en lugar de' sys.sql_modules'), esto siempre devuelve 'CREATE VIEW', independientemente de si se modificó por última vez con' ALTER VIEW'. La versión alterada todavía se devuelve, solo con "crear" al principio. – Nathan

+4

consulta SQL de la respuesta se puede simplificar un poco: 'Select m.definition de sys.sql_modules m donde m.object_id = object_id ('dbo.MyView', 'V')' – Ivan

10

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' 
10

Microsoft enumera los métodos siguientes para conseguir el un Ver definición: 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'; 
5
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee')) 
Cuestiones relacionadas