数百のテーブルを含むデモデータベースがあります。各テーブルには通常、smalldatetimeデータ型であるtstampという名前のフィールドが少なくとも1つあります。一部のテーブルには他の日付フィールドもあります。多くのテーブルには、1つ以上のトリガーもあります。
各テーブルの日付フィールドを指定された日数だけインクリメントするスクリプト(難しい方法-以下を参照)を作成しました。アイデアは、すべての日付を同じ日数で更新することにより、データをより「最新」に見せることです。
システムテーブルをループしてデータベース内の各ユーザーテーブルを識別し、そのテーブルのすべてのトリガーを無効にし、日数を追加して各smalldatetimeフィールドを変更し、トリガーを再度有効にすることで、これを行う簡単な方法があると確信しています。次のテーブルに移動します。そのようなT-SQLの書き方がわかりません。
テイカーはいますか?
ありがとう。ジョー
サンプルスクリプト:
DECLARE @numDaysToAdd int
SET @numDaysToAdd = 100
ALTER TABLE someTableDISABLE TRIGGER someTrigger
UPDATE someTable
SET tstamp = DATEADD(day, @numDaysToAdd, tstamp)
-- update any other smalldatetime field in the table too.
ALTER TABLE someTable ENABLE TRIGGER someTrigger
-- same pattern for 200 more tables!
================================================== ========================================トリガーの問題を省略して、次のようなスクリプトを作成します。作品:
DECLARE @numDaysToAdd int
SET @numDaysToAdd = 1
@numDaysToAdd>0の場合
始める
DECLARE @tablename varchar(100)
DECLARE @currtable varchar(100)
DECLARE @currcolumn varchar(100)
DECLARE @columnname varchar(100)
DECLARE @strSQL nvarchar(4000)
tnames_cursorCURSORを宣言します
にとって
SELECT t.TABLE_NAME、c.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS c join INFORMATION_SCHEMA.TABLES t ON t.TABLE_NAME = c.TABLE_NAME
WHERE(c.DATA_TYPE ='smalldatetime' OR c.DATA_TYPE ='datetime')AND t.TABLE_TYPE <>'VIEW'
t.TABLE_NAME、c.COLUMN_NAMEDESCによる注文
OPEN tnames_cursor
FETCH NEXT FROM tnames_cursor INTO @ tablename、@ columnname
SET @currcolumn = @columnname
SET @currtable = @tablename
SET @strSQL = N'UPDATE' + @tablename + CHAR(13)+ CHAR(10)+'SET' + @columnname +'= DATEADD(day、' + CONVERT(varchar(10)、@ numDaysToAdd)+'、 '+ @columnname +') '
WHILE(@@ FETCH_STATUS = 0)
始める
IF(@currtable = @tablename)
BEGIN
IF @currcolumn <> @columnname
SET @strSQL = @strSQL + N',' + CHAR(13)+CHAR(10) + @columnname + ' = DATEADD(day, ' + CONVERT(varchar(10),@numDaysToAdd) + ', ' + @columnname + ')'
END
そうしないと
BEGIN
SET @currtable = @tablename
SET @currcolumn = @columnname
EXEC sp_executesql @strSQL
SET @strSQL = N'UPDATE ' + @tablename + CHAR(13)+CHAR(10) + 'SET ' + @columnname + ' = DATEADD(day, ' + CONVERT(varchar(10),@numDaysToAdd) + ', ' + @columnname + ')'
END
FETCH NEXT FROM tnames_cursor INTO @ tablename、@ columnname
終わり
--最後のステートメントEXECsp_executesql@strSQLを実行します
tnames_cursorを閉じる
tnames_cursorの割り当てを解除します
終わり