0

私のデータベースには、さまざまなアクションが実行された、または実行される予定の日時を記録するレコードがたくさんあります。データベースを適切にテストするために、これらすべてを過去に6か月、1年など(システム時間を変更するのではなく)移動させたいと思います。日数でパラメータ化されたストアドプロシージャを使用してこれを実現するにはどうすればよいですか?

(datetime2などの他の日付/時刻タイプも含める場合はボーナスポイント)

明確にするために、私はすべてのテーブルのすべての列を動的に更新するものを探しています。

4

1 に答える 1

7

とてもシンプルなようです...

CREATE PROCEDURE dbo.MoveDatesBack @NumberOfDays INT
AS BEGIN

   UPDATE dbo.YourTableNameHere
   SET SomeDateColum = DATEADD(DAY, @NumberOfDays, SomeDateColumn) 

   -- repeat the above statement for each table/column that you need to "move back"

END

これをそのように呼んでください:

EXEC  dbo.MoveDatesBack @NumberOfDays = -30

またはあなたが必要とするものは何でも..。

このDATEADD関数は、SQL Server 2008以降の任意の日付型で機能する必要があります。これをに適用すると、新しい関数が返されDATETIME2ます。DATETIME2

しかし、これはStackoverflowには単純すぎるようです-ここで何が欠けていますか?

更新:これをグローバルに、データベース全体のすべてのテーブルとすべての日付関連の列で実行する場合は、次のようなカーソルベースのアプローチを使用できます。

CREATE PROCEDURE dbo.MoveDatesBack @NumberOfDays INT
AS BEGIN
  DECLARE TableCursor CURSOR FAST_FORWARD 
  FOR
     SELECT t.Name, c.name
     FROM sys.columns c 
     INNER JOIN sys.tables t ON c.object_id = t.object_id
     INNER JOIN sys.types typ ON c.system_type_id = typ.system_type_id
     WHERE typ.system_type_id IN (40, 42, 43, 61)  
     -- 40 = date, 42 = datetime2, 43 = datetimeoffset, 61 = datetime

  DECLARE @TableName sysname, @ColumnName sysname

  OPEN TableCursor

  FETCH NEXT FROM TableCursor INTO @TableName, @ColumnName

  WHILE @@FETCH_STATUS = 0
  BEGIN
      DECLARE @Stmt NVARCHAR(999)

      SET @Stmt = 'UPDATE ' + QUOTENAME(@TableName) + 
                  ' SET ' + QUOTENAME(@ColumnName) + ' = DATEADD(DAY, ' + 
                  CAST(@NumberOfDays AS VARCHAR(10)) + ', ' + 
                  QUOTENAME(@ColumnName) + ')'

      -- PRINT @Stmt
      EXEC (@Stmt)

      FETCH NEXT FROM TableCursor INTO @TableName, @ColumnName
  END

  CLOSE TableCursor
  DEALLOCATE TableCursor
END

自己責任!これにより、データベース全体で大規模な更新が行われます。何か問題が発生した場合に備えて、ロールバックするための十分なバックアップを用意してください。

すべてのテーブルがデフォルトのスキーマにあると想定しているという点で、かなり単純化されています。このサンプルでは、​​スキーマ情報を確認して含めていません。追加することができます-物事をもう少し複雑にする/より複雑にするだけです。

于 2012-11-15T14:18:18.090 に答える