【发布时间】:2020-11-16 14:07:03
【问题描述】:
我要做的就是检查hire_state列的数据类型是否为bit,如果是,则将其更改为SmallInt。
这是我的代码
IF OBJECT_ID(N'dbo.employees') IS NULL
BEGIN
CREATE TABLE dbo.employees
(
employees_id INT IDENTITY(1, 1) PRIMARY KEY,
employees_number INT NOT NULL,
first_name NVARCHAR(120) NOT NULL,
last_name NVARCHAR(120) NOT NULL,
birthday DATE NOT NULL,
gender TINYINT NOT NULL,
hire_date DATE NOT NULL,
phone1 NCHAR(25) NOT NULL,
phone2 NVARCHAR(25),
home_address NVARCHAR(255) NOT NULL,
granty NVARCHAR(250),
hire_state BIT NOT NULL DEFAULT 1,
leave_Date DATE,
job SMALLINT NOT NULL
);
END
ELSE
BEGIN
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.TABLE_NAME = N'employees'
AND C.COLUMN_NAME = 'employee_image')
ALTER TABLE dbo.employees
ADD employee_image NVARCHAR(255)
ALTER TABLE dbo.employees
ALTER COLUMN hire_state TINYINT NOT NULL
END;
如何检查hire_state是否为位,然后将其更改为TinyInt?
当我执行上面显示的代码时,我得到了这个错误
消息 5074,第 16 层,状态 1,第 49 行
对象“DF__employees__hire___267ABA7A”依赖于列“hire_state”。消息 4922,第 16 级,状态 9,第 49 行
ALTER TABLE ALTER COLUMNhire_state 失败,因为一个或多个对象访问此列。
我没有在任何其他表格中使用hire_state
【问题讨论】:
-
hire_state有一个DEFAULT CONSTRAINT;您需要先DROP该约束,然后重新创建它。 -
以及如何先检查是否位
-
"以及如何先检查是否位" 嗯?
first_name在您的示例中是nvarchar并将其定义为bit将是一个糟糕的主意。 -
hire_state 位
-
检查
hire_state是否存在作为bit列可以这样做:IF EXISTS (SELECT * FROM sys.columns WHERE name = N'hire_state' AND object_id = OBJECT_ID('dbo.employees') AND system_type_id = 104)- 但要修改它,您必须先找出默认约束的名称,然后删除它
标签: sql sql-server