从 C# 确定 SQL Server 数据库列的默认值

Pau*_*aul 2 .net c# t-sql sql-server database-schema

我需要从 .Net 查找 SQL Server 2005 或 2008 数据库中列的默认值。

我的第一次尝试是执行存储过程:

sp_help @objname
Run Code Online (Sandbox Code Playgroud)

@objname桌子在哪里。然后在返回的第七个表(约束表)中,我将使用constraint_keys默认约束的值。当我从 SQL Server Management Studio 运行此查询时,它的行为符合预期,但当我从 C# 代码运行它时,该constraint_keys列为空(尽管所有其他列都已填充)。

我的第二次尝试是使用:

SELECT name, [text]
FROM syscomments com
    INNER JOIN syscolumns col ON com.id = col.cdefault
WHERE col.id = object_id(@Table)
    AND col.cdefault > 0
Run Code Online (Sandbox Code Playgroud)

这在 SQL Server Management Studio 中也可以正常工作。然而,当我从 .Net 运行它时,它不返回任何行。

额外的:

.Net 代码示例(使用企业库):

    private DataTable GetDefaults(string tablename string database)
    {            
        var db = DatabaseEL.Create(database);

        string sql = @"
            SELECT name, [text]
            FROM syscomments com
                INNER JOIN syscolumns col ON com.id = col.cdefault
            WHERE col.id = object_id(@Table)
                AND col.cdefault > 0";

        using (var command = db.GetSqlStringCommand(sql))
        {
            db.AddInParameter(command, "@Table", DbType.String, tablename);

            return db.ExecuteDataTable(command);
        }
    }
Run Code Online (Sandbox Code Playgroud)

请注意,我现在还尝试了链接的类似问题中的以下每一项:

SELECT 
name, object_definition(default_object_id) AS default_value
FROM sys.columns
WHERE object_id = object_id(@Table)
AND default_object_id != 0
Run Code Online (Sandbox Code Playgroud)

SELECT
sc.name AS column_name, 
    sm.text AS default_value
FROM sys.sysobjects so
    JOIN sys.syscolumns sc ON sc.id = so.id
    LEFT JOIN sys.syscomments SM ON sm.id = sc.cdefault
WHERE so.xtype = 'U' 
AND SO.name = @Table
AND sm.text IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

它们都在 SSMS 中工作,但在 .Net 中,前者的列中有空值default_value,后者没有行。

Pau*_*aul 5

答案似乎是授予用户对该db_ddladmin角色的访问权限。虽然db_datareaderdb_datawriter足以运行必要的查询,但如果用户无权访问,它们都会返回 NULL 作为默认值db_ddladmin

当然,它在 SQL Server Management Studio 中为我工作的原因是因为我以管理用户身份登录。