sql-server - 如果 SQL Server 中存在列,如何更新表?

标签 sql-server tsql

我有一个由以下人员创建的表 MyTable

CREATE TABLE MyTable
(
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [Type] [int] NOT NULL,
    [CreatedDate] [datetime] NOT NULL,
    [ModifiedDate] [datetime] NOT NULL,
)

我想检查表中是否存在列,如果存在,我想将数据复制到不同的列,然后删除旧列,如下所示:

IF (SELECT COLUMNPROPERTY(OBJECT_ID('MyTable'), 'Timestamp', 'Precision')) IS NOT NULL
BEGIN
    UPDATE [dbo].[MyTable]
    SET [CreatedDate] = [Timestamp]

    ALTER TABLE [dbo].[MyTable]
    DROP COLUMN [Timestamp]
END
GO

但是,当我尝试运行此程序时,出现错误:

Invalid column name 'Timestamp'

我怎样才能完成我想做的事情?

最佳答案

这是一个编译问题。

如果在编译批处理时该表不存在,则一切正常,因为引用该表的语句将受到延迟编译的影响。但是,对于预先存在的表,您将遇到此问题,因为它尝试编译所有语句并阻止不存在的列。

您可以将代码推送到子批处理中,这样只有在命中该分支时才会编译它。

IF (SELECT COLUMNPROPERTY(OBJECT_ID('MyTable'), 'Timestamp', 'Precision')) IS NOT NULL
BEGIN
EXEC('
    UPDATE [dbo].[MyTable]
    SET [CreatedDate] = [Timestamp]

    ALTER TABLE [dbo].[MyTable]
    DROP COLUMN [Timestamp]
    ')
END
GO

如果您只是想重命名该列

EXEC sys.sp_rename 'dbo.MyTable.[TimeStamp]' , 'CreatedDate', 'COLUMN'

不过会更容易(从 CreatedDate 列不存在的位置)。

关于sql-server - 如果 SQL Server 中存在列,如何更新表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38443949/

相关文章:

SQL 查询修剪字符串

sql-server - 如何从文件路径中提取文件名

sql-server - 如何在SQL Server 表的所有列中选择具有空值的行?

sql - 如何将数据库中的所有 sql server management studio 事件作为可执行的 mssql 日志获取?

sql-server - 识别需要分区的对象

sql - 查询30000条SQL记录的方法

sql-server - 检索离线的 SQL Server 数据库的文件列表

sql - 我想通过 MS SQL 中的交替数字进行排序,例如 1、2、3、1、2、3 等

sql 查询(可能可以通过 pivot/unpivot 解决?)

sql - 如何在 T-SQL 中根据前几个月的数据确定缺失月份的值