使用Oracle我使用DbConnection.GetSchema执行此操作,但MSDN非常清楚地说明SQLSRV无法实现:
https://msdn.microsoft.com/en-us/library/ms254969(v=vs.110).aspx#Indexes
那么当表,索引名和索引列已知时,如何做到这一点?我已经有代码读取其他所有内容(除了SQLSRV的索引唯一性)我需要从Db获得我需要的所有提供程序。
答案 0 :(得分: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 table / object_id则不需要子查询。这将使它更快。