是否可以使用ADO.NET找出SQLSRV表索引的唯一性?

时间:2017-03-21 14:50:37

标签: sql-server ado.net database-schema system.data

使用Oracle我使用DbConnection.GetSchema执行此操作,但MSDN非常清楚地说明SQLSRV无法实现:

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

那么当表,索引名和索引列已知时,如何做到这一点?我已经有代码读取其他所有内容(除了SQLSRV的索引唯一性)我需要从Db获得我需要的所有提供程序。

1 个答案:

答案 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则不需要子查询。这将使它更快。