[英]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.