【问题标题】:SQL Server column date default gatedate() to datetime in scriptsSQL Server 列日期默认 getdate() 到脚本中的日期时间
【发布时间】:2019-01-27 13:44:08
【问题描述】:

注意>我不能修改旧脚本!!!

第一个脚本创建表 TABLENAME。

我有表 TABLENAME 列 COLUMNNAME DATE DEFAULT GETDATE();

我需要做的:->

ALTER TABLE TABLENAME 
ALTER COLUMN COLUMNNAME DATETIME;

我得到一个错误:

对象“DF__TABLENAME__COLUMNNAME__7BC8385B”依赖于列“COLUMNNAME”。

我在多个数据库上都有这个脚本,所以这部分 'DF__TABLENAME__COLUMNNAME__7BC8385B'

在每个数据库上都不同。

我可以做

ALTER TABLE TABLENAME 
DROP CONSTRAINT DF__TABLENAME__COLUMNNAME__7BC8385B;

它会起作用,但在所有数据库上手动使用它不会很有效,我需要制作脚本,它会在任何地方更改此列,而无需知道该约束名称。

【问题讨论】:

  • 我并没有完全按照您在这里真正想要做的事情,但动态 SQL 可能是解决方案。基本上,您可以使用变量作为输入来构建查询字符串,然后执行它。
  • 我需要在脚本中将日期更改为日期时间,但我不能这样做,因为此列有约束,并且在每个数据库上,此约束都有不同的名称,所以我不知道如何更改它,因为我不能改变,因为错误/对象是依赖的,我不能放弃约束,因为我不知道确切的名字。
  • 看起来有人没有命名他们的约束,如果它有一个像 DF__TABLENAME__COLUMNNAME__7BC8385B 这样的名字。到目前为止你有没有尝试过?
  • 是的,这个约束是在我使用 Default gatdate() 之后创建的
  • 从字典中获取约束名称,使用该数据构建一个删除它的语句并执行它。这就是动态 SQL 部分。然后更改列并重新创建约束。

标签: sql sql-server


【解决方案1】:

如果您有变量约束名称,则必须为每个数据库生成更改脚本。如果您对此有信心,可以将生成的脚本放入 sp_executesql 调用中。

这是使用 sys 视图查询数据库结构并在最后一个结果列中生成脚本。

declare @TableName nvarchar(128) = 'TABLENAME';
declare @ColumnName nvarchar(128) = 'COLUMNNAME';

SELECT t.name [table], c.name [column], typ.name [type]
, def.name [DefaultConstraint], def.definition [DefaultValue]
, 'ALTER TABLE [' + t.name + '] DROP CONSTRAINT [' + def.name + ']; ALTER TABLE [' + t.name + '] ALTER COLUMN [' + c.name + '] DATETIME; ALTER TABLE [' + t.name + '] ADD CONSTRAINT [DF_' + t.name + '_' + c.name + '] DEFAULT getdate() FOR [' + c.name + '];'
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
JOIN sys.types typ on c.user_type_id=typ.user_type_id
LEFT JOIN sys.default_constraints def on c.default_object_id=def.object_id
WHERE typ.name = 'date'
and t.name = @TableName and c.name = @ColumnName
order by t.name, c.name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2021-10-22
    相关资源
    最近更新 更多