Tsql 添加+;数据类型的每个字段x年';日期时间';

Tsql 添加+;数据类型的每个字段x年';日期时间';,tsql,axapta,sql-server-2012,dynamics-ax-2012,Tsql,Axapta,Sql Server 2012,Dynamics Ax 2012,我想为AX 2012采集样本数据,并为数据类型的每个字段添加3年:datetime 我知道有dateadd函数,我可以单独更新每个字段,只是不知道如何搜索数据库,找到datetime类型的每个字段并执行更新 也许要建立一个包含所有这类字段的临时表 我对sql非常陌生,所以请保持温和…这将为每列提供一个单独的UPDATE语句 DECLARE @sql NVARCHAR(MAX) = N''; SELECT @sql += N' UPDATE ' + QUOTENAME(OBJECT_SCHEMA

我想为AX 2012采集样本数据,并为数据类型的每个字段添加3年:datetime

我知道有dateadd函数,我可以单独更新每个字段,只是不知道如何搜索数据库,找到datetime类型的每个字段并执行更新

也许要建立一个包含所有这类字段的临时表


我对sql非常陌生,所以请保持温和…

这将为每列提供一个单独的
UPDATE
语句

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
UPDATE ' + QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
 + '.' + QUOTENAME(OBJECT_NAME([object_id]))
 + ' SET ' + QUOTENAME(name) 
 + ' = DATEADD(YEAR, 3, ' + QUOTENAME(name) + ');'
FROM sys.columns 
WHERE system_type_id = 61 
-- or maybe IN (40, 42, 43, 58, 61) if you want to handle all date types 
AND is_computed = 0
AND [object_id] IN 
(
  SELECT object_id FROM sys.tables
  WHERE OBJECTPROPERTY([object_id], 'IsMsShipped') = 0
);

PRINT @sql;
--EXEC sp_executesql @sql;

在表有多个datetime列的情况下,您可能需要做一些更复杂的事情来对每个表进行多列更新,但是对于这样的一次性任务,额外的复杂性似乎不值得性能上的差异。

这将为每个列提供一个单独的
UPDATE
语句

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
UPDATE ' + QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
 + '.' + QUOTENAME(OBJECT_NAME([object_id]))
 + ' SET ' + QUOTENAME(name) 
 + ' = DATEADD(YEAR, 3, ' + QUOTENAME(name) + ');'
FROM sys.columns 
WHERE system_type_id = 61 
-- or maybe IN (40, 42, 43, 58, 61) if you want to handle all date types 
AND is_computed = 0
AND [object_id] IN 
(
  SELECT object_id FROM sys.tables
  WHERE OBJECTPROPERTY([object_id], 'IsMsShipped') = 0
);

PRINT @sql;
--EXEC sp_executesql @sql;

在表有多个datetime列的情况下,您可能需要做一些更复杂的事情来对每个表进行多列更新,但是对于这样的一次性任务,额外的复杂性似乎不值得性能上的差异。

这将满足您的要求,但在取消注释EXEC之前,我会仔细考虑。在我看来,您似乎不太可能真的希望以这种方式更新数据库中的每个datetime列。@GilM这正是我首先使用
PRINT
的原因,但是我确实认为该要求至少是经过一些思考制定的。如果你意识到它不是你想要的,那么撤销它也很容易。这根本不是对剧本的批评。我只是想为OP添加一个额外的警告,以确保他真的希望将此应用于每个表的每个datetime列。而且,只有在尝试撤消之前没有更新任何表的情况下,撤消才很容易。是的,您还可以添加筛选器,以便只在特定架构的表中包含列,或者只在与特定命名方案匹配的表中包含列。祝您好运,但我怀疑当日期位于唯一索引中时,这将提供“重复键”。这将满足您的要求,但我会在取消对执行官的注释之前仔细考虑。在我看来,您似乎不太可能真的希望以这种方式更新数据库中的每个datetime列。@GilM这正是我首先使用
PRINT
的原因,但是我确实认为该要求至少是经过一些思考制定的。如果你意识到它不是你想要的,那么撤销它也很容易。这根本不是对剧本的批评。我只是想为OP添加一个额外的警告,以确保他真的希望将此应用于每个表的每个datetime列。而且,只有在尝试撤消之前没有更新任何表的情况下,才容易撤消。是的,您还可以添加筛选器,以便只在特定架构的表中包含列,或者只在与特定命名方案匹配的表中包含列。祝您好运,但我怀疑这会给出“重复键”当日期在唯一索引中时。如果您发现答案有用,请接受它。如果您发现答案有用,请接受它。