【问题标题】:Check column data type and change it in SQL Server检查列数据类型并在 SQL Server 中更改它
【发布时间】: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


【解决方案1】:

好的,我根据评论更改我的代码库,它可以工作

   IF EXISTS (SELECT * FROM sys.columns WHERE name = 
    N'hire_state' AND 
   object_id= OBJECT_ID('dbo.employees') AND  
   system_type_id = 104)
   BEGIN 
     ALTER TABLE dbo.employees DROP CONSTRAINT DF__employees__hire___267ABA7A 
     ALTER TABLE dbo.employees ALTER COLUMN  hire_state TINYINT NOT NULL 
   END;

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多