2017-03-21 4 views
-1

Avec Oracle Je le fais avec DbConnection.GetSchema, mais MSDN dit très clairement qu'il est impossible avec SQLSRV:Est-il possible de trouver l'unicité d'index de table SQLSRV en utilisant ADO.NET?

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

Alors, comment cela peut se faire lorsque les colonnes de table, le nom de l'index et l'index sont connus ? J'ai déjà du code qui lit tout le reste (sauf l'unicité d'index dans le cas de SQLSRV) dont j'ai besoin de Db avec tous les fournisseurs dont j'ai besoin.

+0

merci d'avoir commenté la raison de votre vote. Faisons tellement bien encore! –

+1

Quelle est la question en fait? Je n'ai pas downvote, mais qu'est-ce que vous essayez de faire et pourquoi utilisez-vous GetSchema pour le faire? Si, comme vous le dites, la documentation indique que vous ne pouvez pas utiliser GetSchema pour cela, pourquoi l'utilisez-vous au lieu d'interroger les vues 'sys'? –

+0

en fait je l'ai mérité, mais j'apprécierais vraiment l'explication quand downvoted. La documentation date de plusieurs années et j'ai pensé que cela pourrait être possible avec un équivalent. je réécris ma question. je voudrais entendre le mode @PanagiotisKanavos sur les vues sys. –

Répondre

0

Ceci est juste pour l'infromation si quelqu'un a le même problème. Merci à @Panagiotis Kanavos pour m'avoir donné cette voie.

SQL Server est censé être insensible à la casse, mais comme je ne suis pas sûr que ce soit le cas dans toutes les installations à tout moment, j'ai utilisé UPPER pour les noms de table. Notez que cela peut rendre considérablement plus lent si si vous qu'il est insensible à la casse, ne le font pas comme ça:

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

Si indexName est uniquethe sous-requête de table/object_id n'est pas nécessaire. Cela va beaucoup plus vite.