Можно ли узнать уникальность индекса таблицы SQLSRV с помощью ADO.NET?

В Oracle я делаю это с помощью DbConnection.GetSchema, но MSDN ясно говорит, что это невозможно с SQLSRV:

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

Итак, как это можно сделать, когда таблица, имя индекса и столбцы индекса известны? У меня уже есть код, который читает все остальное (кроме уникальности индекса в случае SQLSRV), который мне нужен из Db со всеми необходимыми мне провайдерами.

1 ответ

Это просто для информации, если у кого-то есть такая же проблема. Спасибо @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 является уникальным, то подзапрос table / object_id не требуется. Это сделает это намного быстрее.

Другие вопросы по тегам