2012-01-08 28 views
5

Tôi đang chạy SQL này:Làm thế nào để loại trừ bảng hệ thống khi truy vấn Sys.Tables?

SELECT S.name as Owner, T.name as TableName FROM sys.tables AS T 
JOIN sys.schemas AS S ON S.schema_id = T.schema_id 

Và kết quả là:

Owner TableName 
------------------------ 
dbo   Person 
dbo   Customer 
dbo   sysdiagrams 

sysdiagrams là một system table nhưng cho thấy trong kết quả.

Cập nhật: Cảm ơn tất cả các câu trả lời và ý kiến ​​của bạn, tôi đang sử dụng Nate Bolam & vmvadivel câu trả lời:

SELECT S.name as Owner, T.name as TableName 
FROM 
    sys.tables AS T 
    INNER JOIN sys.schemas AS S ON S.schema_id = T.schema_id 
    LEFT JOIN sys.extended_properties AS EP ON EP.major_id = T.[object_id] 
WHERE 
    T.is_ms_shipped = 0 AND 
    (EP.class_desc IS NULL OR (EP.class_desc <>'OBJECT_OR_COLUMN' AND 
    EP.[name] <> 'microsoft_database_tools_support')) 
+0

'IS_MS_SHIPPED' có thể là tài sản tốt hơn để sử dụng, nếu bạn cũng muốn loại trừ ví dụ: các đối tượng được thêm vào cơ sở dữ liệu để hỗ trợ nhân rộng (trong khi câu trả lời được chọn chỉ hữu ích để loại trừ, cụ thể là các đối tượng được thêm vào sơ đồ hỗ trợ) –

+2

@Damien_The_Unbeliever: Thật không may, bảng 'sysdiagrams' không có' is_ms_shipped = 1' set - Vì vậy, nó sẽ không bị ảnh hưởng khi bạn cố gắng loại trừ tất cả các bảng hệ thống –

Trả lời

8

SSMS sử dụng thuộc tính mở rộng để đánh dấu bảng sysdiagrams là một loại bảng hệ thống giả.

Hãy thử điều này:

SELECT S.name as Owner, T.name as TableName FROM sys.tables AS T 
INNER JOIN sys.schemas AS S ON S.schema_id = T.schema_id 
LEFT JOIN sys.extended_properties AS EP ON EP.major_id = T.[object_id] 
WHERE (EP.class_desc IS NULL 
OR (EP.class_desc <> 'OBJECT_OR_COLUMN' 
    AND EP.[name] <> 'microsoft_database_tools_support')) 
+0

'T. [Type] = 'U'' có vẻ hơi thừa, vì' sys.tables' đã chọn chỉ các đối tượng thuộc loại 'o.type =' U'' trong định nghĩa của nó –

+1

Loại bỏ thừa thừa T. [Type] = 'U' –

1

Bạn có hãy thử với bên dưới truy vấn, nhờ

SELECT S.name as Owner, T.name as TableName FROM sys.tables AS T 
JOIN sys.schemas AS S ON S.schema_id = T.schema_id 
WHERE T.name <> 'sysdiagrams' 
+1

Cảm ơn câu trả lời của bạn, tôi tin rằng điều này sẽ chỉ loại trừ bảng 'sysdiagrams', nhưng tôi muốn biết nếu cách chung chung để loại trừ tất cả các bảng hệ thống. –

+0

Thông thường, trong mỗi cơ sở dữ liệu được tạo, chỉ có một bảng hệ thống có tên là 'sysdiagrams', vì vậy chúng ta có thể truy vấn ở trên, nhờ thời gian của bạn. –

3

Bạn có thể tận dụng IS_MS_SHIPPED cho việc này. Hy vọng tập lệnh bên dưới là những gì bạn đang tìm kiếm

SELECT 
    S.[name] AS Owner, 
    T.[name] AS TableName 
FROM 
    sys.tables AS T JOIN sys.schemas AS S 
    ON S.schema_id = T.schema_id 
WHERE 
    T.is_ms_shipped = 0 
    AND T.[name] <> 'sysdiagrams' 
+0

Chào mừng bạn đến với StackOverflow: nếu bạn đăng mã, XML hoặc mẫu dữ liệu, hãy ** tô sáng những dòng đó trong trình soạn thảo văn bản và nhấp vào nút "mẫu mã" ('{}') trên thanh công cụ trình soạn thảo để định dạng và cú pháp độc đáo làm nổi bật nó! –

+1

Chắc chắn Marc_s. Cảm ơn bạn đã cho tôi biết về nút "mẫu mã". – vmvadivel

+2

Thật không may, điều này không ** không ** loại trừ bảng 'sysdiagrams' vì bảng đó không có cờ' is_ms_shipped' được đặt ..... –

Các vấn đề liên quan