Có cách nào để truy xuất định nghĩa dạng xem từ SQL Server bằng ADO thuần túy không?


89

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 OpenSchema()lệnh gọi ADO Connection trong các hóa thân khác nhau của nó để tôi có thể lập trình tạo lại các bảng đó trong một cơ sở dữ liệu SQL khác. Càng xa càng tốt.

Tương tác chính với các bảng trên xảy ra bằng cách sử dụng nhiều chế độ xem; while OpenSchema()có thể trả về các định nghĩa cột cho chế độ xem giống như cách nó trả về các định nghĩa cột cho một bảng, một chút 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 mà cột trong chế độ xem ánh xạ tới.

Tôi đã cố gắng truy cập lệnh SQL được sử dụng để tạo chế độ xem bằng ADOX Catalog Views, nhưng có vẻ 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 chế độ xem thông qua ADO, theo cách nêu rõ "ColumnX ánh xạ tới ColumnY trong bảng Z" hoặc dưới dạng lệnh SQL thực được sử dụng để tạo chế độ xem?

Câu trả lời:


160

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

Đối với SQL Server 2005 trở lên, bạn có thể lấy tập lệnh SQL được sử dụng để tạo dạng xem như sau:

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'

Điều này trả về một hàng duy nhất chứa tập lệnh được sử dụng để tạo / thay đổi chế độ xem.

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

Cảnh báo

  • Nếu chế độ xem được sửa đổi lần cuối với CHẾ ĐỘ XEM ALTER, thì tập lệnh sẽ là một câu lệnh ALTER VIEW chứ không phải là một câu lệnh CREATE VIEW.

  • Tập lệnh phản ánh tên khi nó được tạo. Lần duy nhất nó được cập nhật là nếu bạn thực hiện CHẾ ĐỘ XEM ALTER hoặc thả và tạo lại chế độ xem bằng CHẾ ĐỘ XEM TẠO. 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 lược đồ khác, tập lệnh mà bạn nhận lại sẽ phản ánh câu lệnh CREATE / ALTER VIEW ban đầu: nó sẽ không phản ánh các đối tượng có tên hiện tại.

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


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

9
một lưu ý khác là bạn có thể cần quyền phù hợp để có thể xem định nghĩa. Tôi nhận được NULL cho họ.
rveach

1
@schlamar, nếu tất cả những gì bạn thấy là 255 ký tự đầu tiên, thì bạn đang chuyển đổi cột kết quả không chính xác. Lược đồ để sys.sql_modulesxác định cột do đó:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
Nicholas Carey

1
@schlamar, bạn cũng có thể lưu ý rằng nếu bạn đang sử dụng SSMS / Trình phân tích truy vấn, nếu bạn đang chạy kết quả truy vấn dưới dạng văn bản (thay vì lưới), theo mặc định, [n][var]chardữ liệu bị cắt bớt 256 ký tự. Bạn có thể thay đổi điều đó qua menu tại Query..Query Options...& mdash; Từ hộp thoại phương thức tiếp theo, hãy đi sâu vào Results>Textnút trong điều khiển cây ở phía bên trái.
Nicholas Carey

1
Tôi sử dụng công cụ dòng lệnh MS-SQL (sqlcmd.exe). Nó cũng cắt xén dữ liệu. Tôi đã phải truyền tham số -y N để có thêm dữ liệu (thực sự là MS?). Vì vậy, cảm ơn vì đã chỉ cho tôi đúng hướng.
schlamar

24

Microsoft đã liệt kê các phương pháp sau để nhận định nghĩa Chế độ xem: 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

Đối với người dùng SQL 2000, lệnh thực sự 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'

Phiên bản này trả về Chế độ xem được chia thành nhiều bản ghi, mỗi bản ghi 4.000 ký tự. (Đã thử nghiệm trong SQL Server 2014.)
Ben

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

3

Bạn có thể lấy bảng / xem chi tiết thông qua truy vấn dưới đây.

Đối với bảng: sp_help table_name Đối với Chế độ xem: 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');  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.