SQLサーバプログラミング-更新すべての日付が指定された日数

StackOverflow https://stackoverflow.com/questions/1076359

  •  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

終了

役に立ちましたか?

解決

ご理解するものとします。そのような点が欠落してい:

  1. どのメタデータ(テーブル また、カラム)なのか
  2. どう構築するためにはSQLビ のです。

第1のシステムの景色 INFORMATION_SCHEMA.TABLESINFORMATION_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する

次に、先に行くと、各テーブルに関連する結果セットの各列を更新し、トリガを可能にすることによって、続いています。

歓声

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top