2009-11-12 4 views
1

스키마 정보를 읽는 데 'GetSchemaTable'을 사용했지만 일부 '물건'이 누락되었습니다. 그래서 다른 열 중에서 sys.columns를 참조하는 큰 쿼리를 작성했습니다. , sys.index_columns 및 sys.indexes (및 다른 테이블)를 사용하여 GetSchemaTable에서 가져온 것과 동일한 정보를 반환하고 내가 원하는 다른 정보도 반환합니다.보기에서 PK 열을 식별 할 수있는 방법

문제는 GetSchemaTable은 뷰에서 반환 된 열이 원본으로 사용하는 테이블의 키 열이지만 새 쿼리가 아닌지 알려줍니다. 하루 종일 바른 답을 줄 테지만보기가 아닙니다.

누구에게도 해결책이 있습니까? 내가보기를 시험 할 때 GetSchemaTable로 돌아가서 정보의 그 하나의 비트에 대해서만 싫어. (게다가 SQL 기반의 솔루션이 필요합니다.)

고마워!

답변

1

불행히도 SQL Server 2005에서는 그리 쉽지 않습니다. 이 작업을 조금 해봤지만 매우 가깝습니다. 그러나 뷰의 열 이름이 기본 테이블의 이름과 완전히 동일하다는 사실에 의존합니다. SQL-Server-2008의 현재 사용되지 않는 뷰 sys.sql_dependencies가 참조하는 column_id를 제대로 저장하지 않기 때문에 뷰의 실제 열과 일치시킬 방법이 없기 때문입니다. SQL Server 2008은 새로운 종속성 개체 집합을 다시 도입 할 때 더 나은 옵션을 제공 할 것입니다. 나는 또한 INFORMATION_SCHEMA.KEY_COLUMN_USAGE로 경로를 추적하지는 않았지만 이러한 뷰는 이름에 전적으로 의존하고 있기 때문에 동일한 피클에있을 가능성이있는 모든 종류의 ID가 아닙니다. 어쩌면 이것은 당신을위한 시작일 수 있지만, 나는 이것이 단순한 경우만을 다룰 것이라고 말했던 것처럼 말입니다. 별칭을 사용하면 행운을 빕니다. 시간이 허락 어쩌면 이러한 일들이 밖으로 토끼를 끌어와 일치하지 않는 열을 참조하는 방법을 알아낼 것이다 참조하는 방법의 복잡한에 몇 가지 통찰력을 가진 다른 사람 ...

-- very simple; one-column key: 

CREATE TABLE dbo.boo 
(
    far INT PRIMARY KEY 
); 
GO 

CREATE VIEW dbo.view_boo 
AS 
    SELECT far FROM dbo.boo; 
GO 

-- slightly more complex. Two-column key, 
-- not all columns are in key, view columns 
-- are in different order: 

CREATE TABLE dbo.foo 
(
    splunge INT, 
    a INT, 
    mort INT, 
    PRIMARY KEY(splunge, mort) 
); 
GO 

CREATE VIEW dbo.view_foo 
AS 
    SELECT 
     splunge, 
     mort, 
     a 
    FROM 
     dbo.foo; 
GO 

SELECT 
    QUOTENAME(OBJECT_SCHEMA_NAME(v.[object_id])) + '.' 
    + QUOTENAME(v.name) + '.' + QUOTENAME(vc.name) 
    + ' references ' 
    + QUOTENAME(OBJECT_SCHEMA_NAME(t.[object_id])) 
    + '.' + QUOTENAME(t.name) + '.' + QUOTENAME(tc.name) 
FROM 
    sys.views AS v 
INNER JOIN 
    sys.sql_dependencies AS d 
    ON v.[object_id] = d.[object_id] 
INNER JOIN 
    sys.tables AS t 
    ON d.referenced_major_id = t.[object_id] 
INNER JOIN 
    sys.columns AS tc 
    ON tc.[object_id] = t.[object_id] 
INNER JOIN 
    sys.index_columns AS ic 
    ON tc.[object_id] = ic.[object_id] 
    AND tc.column_id = ic.column_id 
    AND tc.column_id = d.referenced_minor_id 
INNER JOIN 
    sys.columns AS vc 
    ON vc.[object_id] = v.[object_id] 
    AND vc.name = tc.name -- the part I don't like 
INNER JOIN 
    sys.indexes AS i 
    ON ic.[object_id] = i.[object_id] 
    AND i.is_primary_key = 1 
ORDER BY 
    t.name, 
    ic.key_ordinal; 

GO 

DROP VIEW dbo.view_boo, dbo.view_foo; 
DROP TABLE dbo.foo, dbo.boo; 
+0

이 나는대로, 좀 더이 함께 재생됩니다 이 작업을 수행 할 수있는 방법이 있다는 것을 확신합니다 (옵티마이 저는 모든 작업을 수행 할 수 있어야합니다).하지만 지금은 그 작업만으로 충분합니다. –

관련 문제