SQLサーバプログラミング-更新すべての日付が指定された日数
-
21-08-2019 - |
質問
私はデモデータベースとホテルのテーブルです。各テーブルには通常、少なくとも一つの分野名tstampであるsmalldatetime datatype.テーブルが他のdatefieldsます。多くのテーブルも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!
========================================================================================== 漏れのトリガを発行、スクリプトと作品
宣言@numDaysToAdd int
セット@numDaysToAdd=1
ば@numDaysToAdd>0
を開始
宣言@tablename varchar(100)
宣言@currtable varchar(100)
宣言@currcolumn varchar(100)
宣言@columnname varchar(100)
宣言@strSQL nvarchar(4000)
を宣言するのにtnames_cursorカーソル
のための
選択。TABLE_NAME、c.COLUMN_NAME
からINFORMATION_SCHEMA.カラムcの参加INFORMATION_SCHEMA.テーブルtに。TABLE_NAME=c.TABLE_NAME
がるものではない。DATA_TYPE='smalldatetime'またはc.DATA_TYPE='datetime')やt.TABLE_TYPE<>"表示"
る。TABLE_NAME、c.COLUMN_NAMEお得に!
開tnames_cursor
フェッチから翌tnames_cursorを@tablename,@columnname
セット@currcolumn=@columnname
セット@currtable=@tablename
セット@strSQL=N'UPDATE'+@tablename+CHAR(13)+CHAR(10)+'設定'+@columnname+'=DATEADD(日は、'+に変換(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
ELSE
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
フェッチから翌tnames_cursorを@tablename,@columnname
終了
--走る最終決 EXEC sp_executesql@strSQL
近tnames_cursor
を修復させようとするとエラーがtnames_cursor
終了
解決
ご理解するものとします。そのような点が欠落してい:
- どのメタデータ(テーブル また、カラム)なのか
- どう構築するためにはSQLビ のです。
第1のシステムの景色 INFORMATION_SCHEMA.TABLES
や INFORMATION_SCHEMA.COLUMNS
:
-- add your own additional criteria
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 = 'datetime'
のためのポリシー-ブリーフ第2号ができるんでSQL文文字列として街を通り、テーブルだし、実行したと sp_executesql
.
他のヒント
私は同意するものとします。別のオプションは、すべての200個のテーブルのSQLを生成するために、システム・テーブルを使用することです。その後、幹部にsp_execsqlを使用することができます。実行は変更されませんが、常に重要であるあなたのタイピングを、保存されます。)
次のクエリは、あなたのタイプであるユーザーテーブルとその列のリストを与えるだろう「SMALLDATETIME」ます。
SELECT sys.columns.name as tableName, sys.tables.name as columnName from sys.columns,sys.tables
where sys.columns.object_id=sys.tables.object_id and sys.columns.system_type_id=58 order by tableName
SMALLDATETIME - ここで58は、データ型のsystem_type_idされます。あなたはsys.typesテーブルからそれを確認することができます。
カーソルを使用すると、各テーブルを取得し、そのテーブルにトリガを無効にする結果セットを反復処理することが可能かもしれません。トリガー禁止のためにこれを確認/有効 http://msdn.microsoft.com/en -us /ライブラリ/ ms189748.aspxする
次に、先に行くと、各テーブルに関連する結果セットの各列を更新し、トリガを可能にすることによって、続いています。
歓声