AX 2012 のサンプル データを取得し、データ型: datetime のすべてのフィールドに 3 年を追加したいと考えています。
私はdateadd関数があることを知っており、すべてのフィールドを個別に更新できますが、データベースを検索してdatetime型のすべてのフィールドを見つけて更新を実行する方法がわかりません。
たぶん、そのタイプのすべてのフィールドの一時テーブルを構築していますか?
私はSQLに非常に慣れていないので、優しくしてください...
AX 2012 のサンプル データを取得し、データ型: datetime のすべてのフィールドに 3 年を追加したいと考えています。
私は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;
テーブルに複数の日時列がある場合は、テーブルごとに複数列の更新を行うためにおそらくもっとトリッキーなことを行うことができますが、このような1回限りのタスクの場合、余分な複雑さはパフォーマンスの違いに見合う価値がないようです.