簡體   English   中英

如何更改SQL Server中列的默認值

[英]How to change the default value of a column in SQL Server

據說我有一個名為Person的表,如下所示:

CREATE TABLE Persons
(
    P_Id uniqueidentifier Default newsequentialid() NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) DEFAULT 'Sandnes'
)

如何使用sql查詢刪除該列的默認值? 此外,如果它不存在,我該如何添加它。 我知道可以通過改變表格並在P_Id列上添加約束來添加它,但我不確定這是否是唯一的方法。 我已經看過這篇文章,但建議的內容似乎並沒有真正起作用。

有任何想法嗎?

找出已存在的表的語法的最簡單方法是在對象資源管理器中右鍵單擊該表,然后選擇“ Script As > Create To > New Window 這將幫助您在需要創建類似表時為其生成腳本。

不過,我不知道為ALTER做一個簡單的方法。 在您的情況下,如果該默認約束不在該列上,我會說:

ALTER TABLE dbo.Persons ADD CONSTRAINT dfCity DEFAULT ('Sandnes') FOR City;

這只是因為我已經知道了為表添加約束的語法,因為我必須做很多事情。 這篇文章有點過時了,但它可能很有用,因為大部分內容仍然具有相關性,並且在新功能方面並沒有太多缺失:

使用默認約束

當然還有聯機叢書中的ALTER TABLE主題:

http://msdn.microsoft.com/en-us/library/ms190273.aspx

如果要刪除約束,首先需要找到名稱,然后您可以說:

ALTER TABLE dbo.Persons DROP CONSTRAINT constraint_name;

@Calin發布了一個查詢,它將獲取約束的名稱,但我認為你不能將@constraintname傳遞給ALTER TABLE語句。

在SQL Server中,默認值定義為與表中特定列關聯的約束。 為所有約束分配一個名稱; 這很重要,因為一旦創建了約束,如果要修改它,就必須通過此名稱引用它。 (而且我會看到這個問題,看看我是不是錯了。)

基於此示例表:

CREATE TABLE MyTable
 (
   MyTableId  int          not null
  ,SomeData   varchar(50)  not null  default 'Foo'
  ,MoreData   datetime     not null  default CURRENT_TIMESTAMP
 )

步驟1:確定列上是否存在約束。 有幾種方法可以做到這一點,所有這些都涉及系統視圖和/或元數據功能 這是一個快速的,其中'MyTable'和'SomeData'可以設置為參數:

SELECT name
 from sys.default_constraints
 where parent_object_id = object_id('MyTable')
  and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId')

嘗試一下,你會發現生成的名字基本上是隨機的。 要確定列上是否存在默認值,您可以執行以下操作:

IF exists (select name
            from sys.default_constraints
            where parent_object_id = object_id('MyTable')
             and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId'))
    PRINT 'Default found'
ELSE
    PRINT 'NoDefault'

要刪除不知道名稱的現有默認值,您必須構建動態SQL。 (引用文章中的代碼是錯誤的,顯然從未測試過。)@Călin與我做的有點不同,但想法是一樣的:

DECLARE @Command nvarchar(max)

SELECT @Command = 'ALTER TABLE MyTable drop constraint ' + name
 from sys.default_constraints
 where parent_object_id = object_id('MyTable')
  and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId')

IF @Command is not null
    EXECUTE sp_executeSQL @Command

(通過錯誤檢查,檢查表和列的參數,等等。)

最后,您可以通過在創建約束時命名默認值來避免大部分問題,如下所示:

CREATE TABLE MyTable
 (
   MyTableId  int          not null
  ,SomeData   varchar(50)  not null
    constraint DF_MyTable__SomeData  default 'Foo'
  ,MoreData   datetime     not null
    constraint DF_MyTable__MoreData  default CURRENT_TIMESTAMP
 )

或者像這樣:

IF not exists (select name
                from sys.default_constraints
                where parent_object_id = object_id('MyTable')
                 and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId'))
    ALTER TABLE MyTable
     add constraint DF_MyTable__SomeData
      default 'Foo' for SomeData

您可以使用sys.default_constraints上的查詢獲取默認約束的名稱,然后通過更改表來刪除它:

declare @constraintname varchar(128);
select @constraintname = d.name
from sys.default_constraints d
join sys.columns c ON c.column_id = d.parent_column_id AND c.object_id = d.parent_object_id
join sys.objects o ON o.object_id = d.parent_object_id
WHERE o.name = 'Persons' AND c.name = 'P_Id';

declare @sql nvarchar(256);
set @sql = 'ALTER TABLE Persons DROP CONSTRAINT ' + @constraintName;
EXEC sp_executesql @sql;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM