.net 在Sql Server中查找列的默认值的最佳方法

.net 在Sql Server中查找列的默认值的最佳方法,.net,sql-server,.net,Sql Server,我想在SQL2005数据库中查找列的默认值。我只有SQL server连接字符串,因此只能使用SQL库名称空间(不能使用Oledb GetSchema)。我知道有一个GetSchema()。。。但是如何使用它来获取列模式,从而获得默认值呢?我无法在datatable上填充Schema,因为它似乎没有填充默认值属性。我可以使用“exec sp_columns'ADDRESS_MASTER'”并返回默认值,但它们不是干净的格式。。。例如,我的一个文本列default返回为“(N'test)” 我还想

我想在SQL2005数据库中查找列的默认值。我只有SQL server连接字符串,因此只能使用SQL库名称空间(不能使用Oledb GetSchema)。我知道有一个GetSchema()。。。但是如何使用它来获取列模式,从而获得默认值呢?我无法在datatable上填充Schema,因为它似乎没有填充默认值属性。我可以使用“exec sp_columns'ADDRESS_MASTER'”并返回默认值,但它们不是干净的格式。。。例如,我的一个文本列default返回为“(N'test)”


我还想得到列大小。。。sp_专栏似乎给了我一切。。。但我不知道如何在所有情况下解码默认值?

查看

select * from INFORMATION_SCHEMA.Columns
这有帮助吗?

您可以使用SMO(SQL Server管理对象)检索该信息。您需要添加对某些
Microsoft.SqlServer.*
程序集的引用(不确定是哪一个-这相当混乱),然后您应该能够执行以下操作:

Server myServer = new Server("servername");
Database myDatabase = myServer.Databases["myDatabaseName"];
Table myTable = myDatabase.Tables["myTableName"];
Column myColumn = myTable.Columns["myColumnName"];

string defaultValue = myColumn.Default;

马克

问得好。如果提前知道数据类型,可以使用一些明显的字符串替换操作来获取格式化值。例如,如果1是int列的默认值,则它将在sp_columns columns_def result中作为((1))返回。今天晚上我已经研究这个问题一段时间了,我没有更好的建议

我不确定这是否会对其他想尝试这一点的人有所帮助,但下面是sp_columns调用以及捕获的结果:

Declare @TableName varchar(255); 
Set @TableName = 'Table';

Declare @ColumnName varchar(255); 
Set @ColumnName = 'Column';

Declare @ColumnDefinition Table 
(
    TABLE_QUALIFIER  sysname null,
    TABLE_OWNER      sysname null,
    TABLE_NAME       sysname null,
    COLUMN_NAME      sysname null,
    DATA_TYPE        sysname null,
    TYPE_NAME        sysname null,
    PRECISION        int null, 
    LENGTH           int null,
    SCALE            int null,
    RADIX            int null,
    NULLABLE         bit null,
    REMARKS          nvarchar(4000) Null,
    COLUMN_DEF       sysname  null,
    SQL_DATA_TYPE    int null,
    SQL_DATETIME_SUB int null,
    CHAR_OCTET_LENGTH int null,
    ORDINAL_POSITION  int null,
    IS_NULLABLE       char(3) null,
    SS_DATA_TYPE      int null
)

Insert Into @ColumnDefinition
Exec sp_columns @TableName, @column_name = @ColumnName

Select COLUMN_DEF From @ColumnDefinition

要获取特定列的默认约束值,请执行以下操作:

SELECT defaults.definition
FROM sys.all_columns AS cols
INNER JOIN sys.default_constraints AS defaults ON cols.default_object_id = defaults.object_id
WHERE cols.object_id = @TABLEID AND cols.[name] = @COLNAME

其中@TABLEID只是表的ID,@COLNAME是数据库中所需列的名称。

这里的问题是默认值是一个表达式,似乎您只希望它返回一个值,如“bob”或5

这主要取决于您拥有GetDate()或调用自定义函数(如dbo.MyFunc())的时刻。此时,它应该返回什么作为默认值

因此,sql server可以做的唯一可靠的事情是将用于生成默认值的表达式返回给您,您可以通过sql server再次运行此操作来确定结果,即:

DECLARE @def nvarchar(max)

SELECT @def = column_def FROM information_schema.columns
WHERE table_name = 'ADDRESS' AND column_name = 'ADDRESS_MASTER'

EXEC ('SELECT ' + @def)

当然,如果表达式不是常量,比如GetDate,那么在插入实际数据时,这将是不正确的。如果使用带有副作用的自定义函数,也会产生问题,但是在默认情况下使用具有副作用的自定义函数,我会考虑一个问题。

不,这与SPA列相同。它仍然返回列_默认值“(N'test')”。。。这就是我要问的…+1个好问题。我被难住了。是的,看你明白了。。。默认值格式在所有情况下我都不知道。。。所以我想我必须建立一系列逻辑,说“如果nvarchar然后regex(…)如果int然后regex(…)”,这就是sux!谢谢你的热情。。。是的,前几天我遇到了这个。。。客户机将“GetDate()”放在那里,我意识到我的假设是错误的。所以我放弃了整个想法,决定将默认设置放在应用程序的单独文件中。我现在唯一的问题是在你和本之间选择接受哪个答案!!