TableA、TableB、TableCなどの複数のテーブルを持つデータベースがあり、Watermarktableというテーブルもあるというシナリオがあります。すべてのテーブル(TableA、TableB ...)には、DateLoadedとして列があります。
テーブル名(TableA、TableB ...)とDateLoaded(TableA、TableB ...の場合)の値を同じデータベースのウォーターマークテーブルに保存しています。
テーブル名とDateLoadedの行を持つウォーターマークテーブル。したがって、テーブル(TableA、TableB ...)が新しいDateLoaded値で更新されるたび
に、ウォーターマークテーブルの値も対応するテーブルで変更されるはずです。これを実現するための簡単なストアドプロシージャを探しています。ありがとう
どうぞ :
開始
TableA TableB TableC
Col1 Col2 LoadDate Col1 Col2 LoadDate Col1 Col2 Loaddate
r1 r1 01/01/2019 rs1 rs1 01/02/2019 ra1 ra1 01/01/2019
r2 r2 01/01/2019 rs2 rs2 01/02/2019 ra2 ra2 01/01/2019
透かしテーブル:
Table Name DateLoaded
TableA 01/01/2019
TableB 01/02/2019
TableC 01/01/2019
明日、新しいデータがテーブルAとBにある場合、透かしテーブルは次のようになります。
Table Name DateLoaded
TableA 12/31/2019
TableB 12/31/2019
TableC 01/01/2019
ここでの注意:DateLoadedは、テーブル全体で同じままです。行によって違いはありません。再度、感謝します
このコードをspとして使用できますが、テーブルとスキーマ名には注意してください。
私はあなたの問題のように私のコードを書こうとしました
DECLARE @TableName NVARCHAR(50)
CREATE TABLE #LocalDateTBL
(
TableName nvarchar(50),
LoadDate datetime
)
DECLARE TBL_Cursor CURSOR
FOR
SELECT '['+S.NAME+'].'+'['+T.NAME+']'
FROM SYS.TABLES T
INNER JOIN SYS.SCHEMAS S ON T.SCHEMA_ID = S.SCHEMA_ID
WHERE TYPE='U'
OPEN TBL_Cursor
FETCH NEXT FROM TBL_Cursor
INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @Command NVARCHAR(MAX)
SET @Command = 'INSERT INTO #LocalDateTBL SELECT '+CHAR(39)+ @TableName +CHAR(39)+', MAX(LoadDate) FROM '+@TableName
PRINT(@Command)
--EXEC(@Command)
FETCH NEXT FROM TBL_Cursor
INTO @TableName
END
CLOSE TBL_Cursor
DEALLOCATE TBL_Cursor
UPDATE C
SET C.LoadDate = T.LoadDate
FROM WaterMark C
INNER JOIN #LocalDateTBL T ON C.TableName = T.TableName
DROP TABLE #LocalDateTBL
このコードは、データベースのforeachテーブルから最大LoadDateを取得するためのクエリを生成し、一時テーブルに日付を挿入し、一時テーブルからウォーターマークテーブルを更新します。
テーブル名の代わりに、ウォーターマークテーブルの各テーブルのobject_idを使用することをお勧めします。
必要に応じて、このソリューションのウォーターマークテーブルに新しいテーブルを追加するための新しいビジネスを追加できます
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加