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,后者没有行。
答案似乎是授予用户对该db_ddladmin角色的访问权限。虽然db_datareader和db_datawriter足以运行必要的查询,但如果用户无权访问,它们都会返回 NULL 作为默认值db_ddladmin。
当然,它在 SQL Server Management Studio 中为我工作的原因是因为我以管理用户身份登录。
| 归档时间: |
|
| 查看次数: |
3688 次 |
| 最近记录: |