2017-03-21 12 views
-1

나는 DbConnection.GetSchema이 작업을 수행하지만, MSDN은 SQLSRV 불가능 것을 매우 분명하게 알려줍니다 : 테이블, 인덱스 이름과 인덱스 컬럼이 알려진 경우이 작업을 수행 할 수 있도록하는 방법을ADO.NET을 사용하여 SQLSRV 테이블 인덱스 고유성을 찾을 수 있습니까? 오라클과 함께

https://msdn.microsoft.com/en-us/library/ms254969(v=vs.110).aspx#Indexes

? 나는 이미 모든 것을 읽는 코드를 가지고있다. (SQLSRV의 경우 색인의 유일성을 제외하고) 내가 필요로하는 모든 공급자와 함께 DB에서 필요하다.

+0

감사의 이유를 설명해 주셔서 감사합니다. 다시 큰소리로 만들어 봅시다! –

+1

실제로 질문은 무엇입니까? 나는 downvote하지 않았지만, * 당신은 무엇을하려하고 왜 GetSchema를 사용하여 그것을합니까? 만약 당신이 말했듯이, 문서에서 GetSchema를 사용할 수 없다고 말하면'sys' 뷰를 쿼리하는 대신 왜 이것을 사용합니까? –

+0

실제로 나는 그것을받을 가치가 있었다. 그러나 downvoted했을 때 나는 정말로 설명을 바르게 평가할 것이다. 설명서는 수년 전이므로 일부 동등한 기능을 통해 가능할 수 있다고 생각했습니다. 나는 내 질문을 다시 써. 나는 sys view에 대해 @PanagiotisKanavos 모드를 듣고 싶다. –

답변

0

누군가가 동일한 문제가있는 경우 정보 제공 용입니다. 나에게이 길을 가르쳐 주신 @Panagiotis Kanavos에게 감사드립니다.

SQL Server는 대소 문자를 구분하지 않겠지 만, 모든 설치에서 항상 그렇듯이 대소 문자를 구분하지 않기 때문에 테이블 이름에 UPPER를 사용했습니다. 이것은 상당히 느린 그래서 확인하는 경우는 대소 문자를 구분 있다고 그것을 만들 수 있다는 것을 참고,이처럼하지 않는다 :

private static bool GetSqlServerIndexUniqueness(DbConnection cnctn, string tableName, string indexName) 
    { 
     bool isUnique = false; 
     using (SqlCommand cmd = ((SqlConnection) cnctn).CreateCommand()) 
     { 
      cmd.CommandText = 
        "SELECT is_unique FROM sys.indexes WHERE name = @IndexName AND object_id = " + 
        "(SELECT object_id FROM sys.tables WHERE upper(name) = @TableNameUpper)"; 

      cmd.Parameters.AddWithValue("@IndexName", indexName); 
      cmd.Parameters.AddWithValue("@TableNameUpper", tableName.ToUpper()); 
      var readValue = cmd.ExecuteScalar(); 
      if (readValue != null) 
       isUnique = Convert.ToInt32(readValue) != 0; 
     } 
     return isUnique; 
    } 

을 INDEXNAME이 필요하지 않습니다 uniquethe 테이블/OBJECT_ID 하위 쿼리 인 경우. 이렇게하면 훨씬 빨라집니다.