일반 ADO를 사용하여 SQL Server에서 뷰 정의를 검색하는 방법이 있습니까?


90

OpenSchema()다양한 구현에서 ADO 연결 호출을 사용하여 SQL 서버에서 호스팅되는 데이터베이스에서 열 정의를 성공적으로 추출하여 다른 SQL 데이터베이스에서 이러한 테이블을 프로그래밍 방식으로 다시 만들 수 있습니다. 여태까지는 그런대로 잘됐다.

위 테이블과의 주요 상호 작용은 여러보기를 사용하여 발생합니다. 동안 OpenSchema()이 테이블에 대한 열 정의를 반환하는 같은 방법으로 뷰의 열 정의를 반환 할 수있는 정보의 중요한 비트 누락 - 뷰에서 열이 매핑되는 기본 테이블에있는 테이블 및 열.

ADOX 카탈로그 뷰를 사용하여 뷰를 만드는 데 사용 된 SQL 명령에 액세스하려고했지만 사용중인 SQL Server 용 OLEDB 드라이버가이 기능을 지원하지 않는 것 같습니다.

"ColumnX가 테이블 Z의 ColumnY에 매핑"이라는 방식으로 또는보기를 만드는 데 사용 된 실제 SQL 명령 형식으로 ADO를 통해보기 구성에 대한이 정보를 얻을 수있는 방법이 있습니까?

답변:


164

어떤 버전의 SQL Server?

SQL Server 2005 이상에서는 다음과 같이보기를 만드는 데 사용되는 SQL 스크립트를 얻을 수 있습니다.

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'

뷰를 생성 / 변경하는 데 사용되는 스크립트가 포함 된 단일 행을 반환합니다.

테이블의 다른 열은 뷰가 컴파일 될 때 사용 된 옵션에 대해 알려줍니다.

주의 사항

  • 뷰가 ALTER VIEW로 마지막으로 수정 된 경우 스크립트는 CREATE VIEW 문이 아닌 ALTER VIEW 문이됩니다.

  • 스크립트는 생성 된 이름을 반영합니다. 업데이트되는 유일한 시간은 ALTER VIEW를 실행하거나 CREATE VIEW를 사용하여 뷰를 삭제하고 다시 만드는 경우입니다. 뷰의 이름이 변경되었거나 (예 :를 통해 sp_rename) 소유권이 다른 스키마로 전송 된 경우, 반환되는 스크립트는 원래 CREATE / ALTER VIEW 문을 반영합니다. 객체의 현재 이름은 반영되지 않습니다.

  • 일부 도구는 출력을 자릅니다. 예를 들어 MS-SQL 명령 줄 도구 sqlcmd.exe는 255 자에서 데이터를 자릅니다. 매개 변수 -y N를 전달하여 N문자로 결과를 얻을 수 있습니다 .


8
대답의 SQL 쿼리는 약간 단순화 될 수 있습니다.select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
Ivan

9
또 다른주의 사항은 정의를 볼 수 있으려면 올바른 권한이 필요할 수 있다는 것입니다. 나는 그들에 대해 NULL을 얻고 있습니다.
rveach

1
@schlamar, 표시되는 것이 처음 255자인 경우 결과 열을 잘못 변환하는 것입니다. 의 스키마 sys.sql_modules열 따라서 정의definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
니콜라스 캐리

1
@schlamar, SSMS / 쿼리 분석기를 사용하는 경우 쿼리 결과를 그리드가 아닌 텍스트 로 실행하는 경우 기본적으로 [n][var]char데이터가 256 자에서 잘립니다. Query..Query Options...& mdash; 의 메뉴를 통해 변경할 수 있습니다 . 다음 모달 대화 상자 Results>Text에서 왼쪽의 트리 컨트롤에있는 노드로 드릴 다운합니다 .
Nicholas Carey

1
MS-SQL 명령 줄 도구 (sqlcmd.exe)를 사용합니다. 데이터도 잘립니다. 더 많은 데이터를 얻으려면 매개 변수 -y N을 전달해야했습니다 (정말 MS?). 저를 올바른 방향으로 알려 주셔서 감사합니다.
schlamar

24

Microsoft는 View 정의를 얻기 위해 다음과 같은 방법을 나열했습니다. 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';

12

SQL 2000 사용자의 경우이 정보를 제공하는 실제 명령은 다음과 같습니다.

select c.text
from sysobjects     o
join syscomments    c on c.id = o.id
where o.name = '<view_name_here>'
  and o.type      = 'V'

이 버전은 각각 4,000 자의 여러 레코드로 분할 된보기를 반환합니다. (SQL Server 2014에서 테스트 됨)
Ben

7
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))

3

아래 쿼리를 통해 테이블 ​​/ 뷰 세부 정보를 얻을 수 있습니다.

테이블 : sp_help table_name 보기 : sp_help view_name


0
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID('your View Name');  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.