我有一个由以下人员创建的表 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/