如果sql中存在列,如何更新表

Sea*_*yth 5 t-sql sql-server

我有一个由MyTable创建的表

CREATE TABLE MyTable
(
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [Type] [int] NOT NULL,
    [CreatedDate] [datetime] NOT NULL,
    [ModifiedDate] [datetime] NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行它时,我收到一个错误:

Invalid column name 'Timestamp'
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ith 8

这是一个汇编问题.

如果在编译批处理时该表不存在,则所有工作正常,因为引用该表的语句将受延迟编译的影响.但是对于预先存在的表,您将尝试编译不存在的列中的所有语句和空白时遇到此问题.

您可以将代码推送到子批处理中,以便仅在命中该分支时进行编译.

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
Run Code Online (Sandbox Code Playgroud)

如果您只是想重命名该列

EXEC sys.sp_rename 'dbo.MyTable.[TimeStamp]' , 'CreatedDate', 'COLUMN'
Run Code Online (Sandbox Code Playgroud)

虽然更容易(从CreatedDate列不存在的位置).