2011-01-22 29 views
55

Tôi đang trích xuất thành công các định nghĩa cột từ cơ sở dữ liệu được lưu trữ trên máy chủ SQL bằng cách sử dụng lệnh gọi ADO Connection OpenSchema() trong các hóa thân khác nhau của nó để tôi có thể tạo lại các bảng đó trong cơ sở dữ liệu SQL khác. Càng xa càng tốt.Có cách nào để lấy định nghĩa khung nhìn từ Máy chủ SQL bằng ADO thuần túy không?

Tương tác chính với các bảng trên xảy ra khi sử dụng nhiều chế độ xem; trong khi OpenSchema() có thể trả về các định nghĩa cột cho khung nhìn giống như cách nó trả về các định nghĩa cột cho một bảng, một thiếu thông tin quan trọng bị thiếu - bảng và cột nào trong các bảng bên dưới cột trong khung nhìn ánh xạ tới.

Tôi đã cố truy cập lệnh SQL được sử dụng để tạo chế độ xem bằng cách sử dụng Chế độ xem danh mục ADOX, nhưng dường như trình điều khiển OLEDB cho SQL Server mà chúng tôi đang sử dụng không hỗ trợ chức năng này.

Có cách nào để lấy thông tin này cho cấu hình khung nhìn qua ADO hay không, theo cách nói "ColumnX ánh xạ tới cột trong bảng Z" hoặc dưới dạng lệnh SQL thực tế được sử dụng để tạo dạng xem?

+0

tài liệu này [post] (https://stackoverflow.com/documentation/ado/commit) bằng cách sao nó làm điều đó bây giờ trước khi tài liệu là [đi mãi mãi] (https: // meta .stackoverflow.com/questions/356294/remove-documentation-danh tiếng-lưu trữ-và-liên kết? cb = 1)! –

Trả lời

103

Phiên bản SQL Server nào?

Đối với SQL Server 2005 và sau đó, bạn có thể lấy các tập lệnh SQL dùng để tạo ra quan điểm như thế này:

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' 

này trả về một hàng duy nhất có chứa các kịch bản sử dụng để tạo/thay đổi quan điểm.

Các cột khác trong bảng cho biết về các tùy chọn tại chỗ tại thời điểm chế độ xem được biên soạn.

Hãy cẩn thận

  • Nếu quan điểm được sửa đổi lần với ALTER XEM cuối cùng, sau đó kịch bản sẽ là một tuyên bố XEM ALTER chứ không phải là một câu lệnh CREATE VIEW.

  • Tập lệnh phản ánh tên khi được tạo. Thời gian duy nhất nó được cập nhật là nếu bạn thực hiện ALTER VIEW hoặc thả và tạo lại chế độ xem với CREATE VIEW. Nếu chế độ xem đã được đổi tên (ví dụ: qua sp_rename) hoặc quyền sở hữu đã được chuyển sang một giản đồ khác, tập lệnh bạn lấy lại sẽ phản ánh câu lệnh CREATE/ALTER VIEW ban đầu: nó sẽ không phản ánh tên hiện tại của đối tượng.

  • Một số công cụ cắt ngắn đầu ra. Ví dụ, công cụ dòng lệnh MS-SQL sqlcmd.exe cắt ngắn dữ liệu ở 255 ký tự. Bạn có thể chuyển tham số -y N để nhận kết quả với N ký tự.

+0

Trong trường hợp này, chúng ta đang xử lý SQL Server 2008 để cách tiếp cận của bạn hoạt động. Tôi sẽ thử, cảm ơn! –

+0

Trong SQL 2000, (sử dụng 'syscomments' thay vì' sys.sql_modules'), điều này dường như luôn trả về 'CREATE VIEW', bất kể nó được sửa đổi lần cuối với' ALTER VIEW' hay chưa. Phiên bản thay đổi vẫn được trả lại, chỉ với "tạo" ở đầu. – Nathan

+4

Truy vấn SQL từ câu trả lời có thể được đơn giản hóa một chút: 'chọn m.definition từ sys.sql_modules m trong đó m.object_id = object_id ('dbo.MyView', 'V')' – Ivan

10

Đối với người dùng của SQL 2000, lệnh thực tế mà sẽ cung cấp thông tin này là:

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 liệt kê các phương pháp sau đây để nhận được một Xem định nghĩa: 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')) 
Các vấn đề liên quan