Existe uma maneira de recuperar a definição de exibição de um SQL Server usando ADO simples?

92

Estou extraindo com êxito as definições de coluna de bancos de dados hospedados em um servidor SQL usando a OpenSchema()chamada ADO Connection em suas várias encarnações, para que possa recriar programaticamente essas tabelas em outro banco de dados SQL. Por enquanto, tudo bem.

A principal interação com as tabelas acima ocorre usando múltiplas visualizações; embora OpenSchema()seja capaz de retornar as definições de coluna para a visão da mesma maneira que retorna as definições de coluna para uma tabela, uma parte crucial de informação está faltando - para qual tabela e coluna nas tabelas subjacentes a coluna na visão mapeia.

Tentei acessar o comando SQL usado para criar a exibição usando ADOX Catalog Views, mas parece que o driver OLEDB para SQL Server que estamos usando não oferece suporte a essa funcionalidade.

Existe alguma maneira de obter essas informações para a configuração do modo de exibição por meio do ADO, seja de uma forma que indique "A coluna X mapeia para a coluna Y na tabela Z" ou na forma do comando SQL real usado para criar o modo de exibição?

Timo Geusch
fonte

Respostas:

166

Qual versão do SQL Server?

Para o SQL Server 2005 e posterior, você pode obter o script SQL usado para criar a visualização da seguinte forma:

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'

Isso retorna uma única linha contendo o script usado para criar / alterar a visualização.

Outras colunas na tabela informam sobre as opções em vigor no momento em que a visualização foi compilada.

Ressalvas

  • Se a visão foi modificada pela última vez com ALTER VIEW, o script será uma instrução ALTER VIEW em vez de uma instrução CREATE VIEW.

  • O script reflete o nome conforme foi criado. A única vez que ele é atualizado é se você executar ALTER VIEW ou descartar e recriar a visualização com CREATE VIEW. Se a visão foi renomeada (por exemplo, via sp_rename) ou a propriedade foi transferida para um esquema diferente, o script que você receber refletirá a instrução CREATE / ALTER VIEW original: não refletirá o nome atual do objeto.

  • Algumas ferramentas truncam a saída. Por exemplo, a ferramenta de linha de comando do MS-SQL sqlcmd.exe trunca os dados em 255 caracteres. Você pode passar o parâmetro -y Npara obter o resultado com Nchars.

Nicholas Carey
fonte
8
A consulta SQL da resposta pode ser um pouco simplificada:select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
Ivan
9
outra advertência é que você provavelmente precisa das permissões corretas para visualizar a definição. Estou recebendo NULL por eles.
RVeach
1
@schlamar, se tudo o que você está vendo são os primeiros 255 caracteres, você está convertendo a coluna de resultado incorretamente. O esquema para sys.sql_modulesdefine a coluna assim:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
Nicholas Carey
1
@schlamar, você também pode notar que se estiver usando SSMS / Query Analyzer, se estiver executando os resultados da consulta como texto (em vez de uma grade), por padrão, os [n][var]chardados são truncados em 256 caracteres. Você pode alterar isso através do menu em Query..Query Options...& mdash; Na caixa de diálogo modal subsequente, faça uma busca detalhada até o Results>Textnó no controle de árvore no lado esquerdo.
Nicholas Carey
1
Eu uso a ferramenta de linha de comando MS-SQL (sqlcmd.exe). Ele trunca os dados também. Tive que passar o parâmetro -y N para conseguir mais dados (realmente MS?). Obrigado por me apontar na direção certa.
schlamar
24

A Microsoft listou os seguintes métodos para obter uma definição de exibição: 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
fonte
12

Para usuários do SQL 2000, o comando real que fornecerá essas informaçõ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
fonte
Esta versão retorna a visão dividida em vários registros de 4.000 caracteres cada. (Testado no SQL Server 2014.)
Ben
7
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))
STiAT
fonte
2

Você pode obter detalhes da tabela / visualização por meio da consulta abaixo.

Para tabela: sp_help table_name Para Exibir: sp_help view_name

vkstream
fonte
No entanto, não fornece a definição da vista.
Tobb
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
fonte
0

Este exemplo: Coleção de visualizações, Exemplo de propriedade CommandText (VB) Mostra como usar ADOX para manter VIEWS alterando COMMAND relacionado a VIEW. Mas em vez disso, use-o assim:

 Set cmd = cat.Views("AllCustomers").Command  

' Update the CommandText of the command.  
cmd.CommandText = _  
"Select CustomerId, CompanyName, ContactName From Customers"  

apenas tente usar desta forma:

Set CommandText = cat.Views("AllCustomers").Command.CommandText
mLipok
fonte