Можно ли узнать уникальность индекса таблицы 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 не требуется. Это сделает это намного быстрее.