2017-03-21 9 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を使用しています。 INDEXNAMEは/ object_idのサブクエリが必要とされていないuniquetheテーブルである場合

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; 
    } 

:NOTEこれは、それはかなり遅いのであれば、それは大文字小文字を区別しないということを確認することができ、こののようにそれをしません。これはそれをより速くするでしょう。

関連する問題