0

AX 2012 のサンプル データを取得し、データ型: datetime のすべてのフィールドに 3 年を追加したいと考えています。

私はdateadd関数があることを知っており、すべてのフィールドを個別に更新できますが、データベースを検索してdatetime型のすべてのフィールドを見つけて更新を実行する方法がわかりません。

たぶん、そのタイプのすべてのフィールドの一時テーブルを構築していますか?

私はSQLに非常に慣れていないので、優しくしてください...

4

1 に答える 1

5

これにより、列ごとに個別の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回限りのタスクの場合、余分な複雑さはパフォーマンスの違いに見合う価値がないようです.

于 2012-09-27T19:13:33.593 に答える