繁体   English   中英

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

[英]Best way to lookup the default value of a column in Sql Server

我想在SQL2005数据库中查找列的默认值。 我只有SQL服务器连接字符串,所以我只能使用Sql库命名空间(不能使用Oledb GetSchema的东西)。 我知道有一个GetSchema()...但是如何使用它来获取列模式,从而得到默认值? 我无法在数据表上填充解决方案,因为这似乎不会填充默认值属性。 我可以使用“exec sp_columns'ADDRESS_MASTER'”并返回默认值,但它们不是一个干净的格式...例如,我的一个文本列默认返回为“(N'test)”。

我也想获得列大小... sp_columns似乎给了我一切......但我不知道如何在所有情况下解码默认值?

好问题。 如果提前知道数据类型,则可以使用一些明显的字符串替换操作来获取格式化的值。 例如,如果1是int列的默认值,则在sp_columns column_def结果中将其返回为((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

这里你的问题是默认值是一个表达式,似乎你希望它只返回一个值,如'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的情况下,那么在您插入实际数据时这将是不正确的。 如果使用带副作用的自定义函数也会导致问题,但是在默认情况下使用带有副作用的自定义函数我已经考虑了问题。

看看输出

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;

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

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是数据库中所需列的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM