Sql server 更改列SQL上的默认约束

Sql server 更改列SQL上的默认约束,sql-server,tsql,Sql Server,Tsql,我有一个用于创建表的SQL脚本,我希望除少数列之外的所有列的默认值都是“”,其他列需要默认值为0的整数 下面创建了该表。由于存在很多列,因此删除了一些列 CREATE TABLE [dbo].[PMIPatients] ( [PID] [varchar](30) NOT NULL, [PatientFirstName] [varchar](30) NULL, [PatientLastName] [varchar](30) NULL, [PatientDOB] [varchar](30) NULL

我有一个用于创建表的SQL脚本,我希望除少数列之外的所有列的默认值都是“”,其他列需要默认值为0的整数

下面创建了该表。由于存在很多列,因此删除了一些列

CREATE TABLE [dbo].[PMIPatients]
(
[PID] [varchar](30) NOT NULL,
[PatientFirstName] [varchar](30) NULL,
[PatientLastName] [varchar](30) NULL,
[PatientDOB] [varchar](30) NULL,
[PatientDoctor] [varchar](30) NULL,
[PatientDiet] [varchar](50) NULL,
[PatientFallRiskLevel] [int] NULL,
[BedId] [int] NULL,
[BedDisplayInfo] TEXT NOT NULL DEFAULT ''
CONSTRAINT [PK_HL7Patient] PRIMARY KEY CLUSTERED 
([PID] ASC) WITH (PAD_INDEX  = OFF,
    STATISTICS_NORECOMPUTE  = OFF,
    IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS  = ON,
    ALLOW_PAGE_LOCKS  = ON)
ON [PRIMARY]
) 
ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
我希望在所选列上设置不同的默认值,以下代码不起作用,因为它表示已经存在默认约束集。所以我想我必须先放弃这个限制

ALTER TABLE [dbo].[PMIPatients] ADD  
DEFAULT ((0)) 
FOR [PatientFallRiskLevel]
表示下面的代码应该能够像这样删除默认值

ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
但是我在默认情况下得到了一个语法错误

如何更改/删除特定列的默认约束

语法为:

ALTER TABLE [dbo].[PMIPatients] ADD CONSTRAINT NameYourConstraint DEFAULT ((0))  FOR [PatientFallRiskLevel]  

ALTER TABLE [dbo].[PMIPatients] DROP CONSTRAINT NameYourConstraint 

添加默认值时,应为约束使用名称。这样,您可以在以后按名称引用这些约束

ALTER TABLE [dbo].[PMIPatients] ADD CONSTRAINT [PatientFallRiskLevel_Default] DEFAULT ((0)) FOR PatientFallRiskLevel
然后,您可以使用以下方法将其删除:

ALTER TABLE [dbo].[PMIPatients] DROP CONSTRAINT [PatientFallRiskLevel_Default] 

创建没有名称的约束时,
SQL Server
会自动创建内部名称。它可以在
[sys].[default\u constraints]
中看到

例如:

DROP TABLE IF EXISTS [dbo].[StackOverflow];

CREATE TABLE [dbo].[StackOverflow]
(
    [colA] INT
   ,[colB] INT DEFAULT(0)
   ,[colC] CHAR(1) DEFAULT('x')
);

GO

SELECT *
FROM [sys].[default_constraints]
WHERE [parent_object_id] = OBJECT_ID('[dbo].[StackOverflow]');

GO
可以使用该名称删除约束

如果您有更多脚本,可以使用以下脚本之一:

-- all suported editions
DECLARE @DynamicTSQLStataement NVARCHAR(MAX)
       ,@TableNameWithSchema SYSNAME;

SET @TableNameWithSchema = '[dbo].[StackOverflow]';

SELECT @DynamicTSQLStataement = STUFF
(
    (
        SELECT ';ALTER TABLE ' + @TableNameWithSchema + ' DROP CONSTRAINT ' + QUOTENAME([name])
        FROM [sys].[default_constraints]
        WHERE [parent_object_id] = OBJECT_ID('[dbo].[StackOverflow]')
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,1
    ,''
);

EXEC sp_executesql @DynamicTSQLStataement;

GO


您使用的是什么数据库?@GOATCO MSSQL expressor只是不使用w3school,而是使用MSDN作为第一手信息。可能存在重复,因此我必须更改不同名称下每列的默认约束是的,没错。这样,您可以在以后按名称引用这些约束。如果您不使用自己的名称,SLQ服务器将为您生成一个名称。
-- SQL Server 2016 or later

DECLARE @DynamicTSQLStataement NVARCHAR(MAX)
       ,@TableNameWithSchema SYSNAME;

SET @TableNameWithSchema = '[dbo].[StackOverflow]';

SELECT @DynamicTSQLStataement = STRING_AGG('ALTER TABLE ' + @TableNameWithSchema + ' DROP CONSTRAINT ' + QUOTENAME([name]), ';')
FROM [sys].[default_constraints]
WHERE [parent_object_id] = OBJECT_ID('[dbo].[StackOverflow]');

EXEC sp_executesql @DynamicTSQLStataement;

GO