簡體   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