มีวิธีการดึงข้อมูลนิยามมุมมองจาก SQL Server โดยใช้ ADO ธรรมดาหรือไม่


92

ฉันสามารถแยกคำจำกัดความของคอลัมน์จากฐานข้อมูลที่โฮสต์บนเซิร์ฟเวอร์ SQL ได้สำเร็จโดยใช้การOpenSchema()เรียกการเชื่อมต่อ ADO ในรูปแบบต่างๆดังนั้นฉันจึงสามารถสร้างตารางเหล่านั้นขึ้นมาใหม่ในฐานข้อมูล SQL อื่นโดยทางโปรแกรมได้ จนถึงตอนนี้ดีมาก

การโต้ตอบหลักกับตารางด้านบนเกิดขึ้นโดยใช้หลายมุมมอง ในขณะที่OpenSchema()สามารถส่งคืนคำจำกัดความของคอลัมน์สำหรับมุมมองในลักษณะเดียวกับที่ส่งกลับคำจำกัดความคอลัมน์สำหรับตารางข้อมูลที่สำคัญขาดหายไป - ตารางและคอลัมน์ใดในตารางที่อยู่ในคอลัมน์ในมุมมองที่แมป

ฉันพยายามเข้าถึงคำสั่ง SQL ที่ใช้สร้างมุมมองโดยใช้ ADOX Catalog Views แต่ดูเหมือนว่าไดรเวอร์ OLEDB สำหรับ SQL Server ที่เราใช้ไม่รองรับฟังก์ชันนี้

มีวิธีใดบ้างในการรับข้อมูลนี้สำหรับการกำหนดค่ามุมมองผ่าน ADO ทั้งในลักษณะที่ระบุว่า "ColumnX แมปกับ ColumnY ในตาราง Z" หรือในรูปแบบของคำสั่ง SQL จริงที่ใช้สร้างมุมมอง

คำตอบ:


166

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 สคริปต์จะเป็นคำสั่ง 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
ข้อแม้อีกประการหนึ่งคือคุณอาจต้องมีสิทธิ์ที่เหมาะสมจึงจะสามารถดูคำจำกัดความได้ ฉันได้รับค่าว่างสำหรับพวกเขา
rveach

1
@schlamar หากสิ่งที่คุณเห็นคืออักขระ 255 ตัวแรกแสดงว่าคุณกำลังแปลงคอลัมน์ผลลัพธ์ไม่ถูกต้อง สคีมาsys.sql_modulesกำหนดคอลัมน์ดังนี้definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
Nicholas Carey

1
@schlamar คุณอาจสังเกตด้วยว่าหากคุณใช้ SSMS / Query Analyzer หากคุณเรียกใช้ผลลัพธ์แบบสอบถามเป็นข้อความ (แทนที่จะเป็นตาราง) โดยค่าเริ่มต้น[n][var]charข้อมูลจะถูกตัดทอนที่ 256 อักขระ คุณสามารถเปลี่ยนผ่านเมนูที่Query..Query Options...& mdash; จากกล่องโต้ตอบโมดอลที่ตามมาให้เจาะลึกลงไปที่Results>Textโหนดในตัวควบคุมทรีทางด้านซ้ายมือ
Nicholas Carey

1
ฉันใช้เครื่องมือบรรทัดคำสั่ง MS-SQL (sqlcmd.exe) มันตัดทอนข้อมูลด้วย ฉันต้องส่งพารามิเตอร์ -y N เพื่อรับข้อมูลเพิ่มเติม (จริงๆ MS?) ขอบคุณมากที่ชี้ให้ฉันไปในทิศทางที่ถูกต้อง
schlamar

24

Microsoft แสดงวิธีการต่อไปนี้ในการรับข้อกำหนดมุมมอง: 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'

เวอร์ชันนี้ส่งคืน View ที่แบ่งออกเป็นหลายระเบียนโดยมีอักขระ 4,000 ตัว (ทดสอบใน SQL Server 2014)
Ben


3

คุณสามารถรับตาราง / ดูรายละเอียดผ่านแบบสอบถามด้านล่าง

สำหรับตาราง: sp_help table_name For View: sp_help view_name



0

ตัวอย่างนี้: Views Collection, CommandText Property Example (VB) แสดงวิธีใช้ ADOX เพื่อรักษา VIEWS โดยการเปลี่ยน COMMAND ที่เกี่ยวข้องกับ VIEW แต่แทนที่จะใช้แบบนี้:

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

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

เพียงแค่ลองใช้วิธีนี้:

Set CommandText = cat.Views("AllCustomers").Command.CommandText
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.