SQL Server データベースを保守する過程で、log20050901 のようなログ テーブルが何千も存在することがよくありますか? 各テーブルにはそれほど多くのデータがなく、それらを 1 つずつ開くのは非常に不便です。また、これらのテーブルのデータを要約して 1 つずつ開くのは非常に面倒です。以下に、テーブルを結合する自動化方法を紹介します。
私のアイデアは、一連の自動操作を完了するユーザー ストアド プロシージャを作成することです。コードは次のとおりです。
-- ストアド プロシージャに BackupData という名前を付けましたが、独自に定義した名前を使用できます。
--パラメータ 1: @TableTarget 生成される対象テーブルの名前
--パラメータ 2: @TableStart マージが開始されるテーブルの名前
--パラメータ 3: @TableEnd マージが終了するテーブルの名前
CREATE PROCEDURE BackupData @TableTarget sysname,@TableStart sysname,@TableEnd sysname
AS
DECLARE tnames_cursor CURSOR
FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
OPEN tnames_cursor
DECLARE @TableName sname
DECLARE @TablePref sysname
D ECLARE @IsTargetExist integer
-- ターゲット テーブルが存在するかどうかを確認します
SET @IsTargetExist=(SELECT count(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES where table_name = @TableTarget)
-- ターゲット テーブルが存在しない場合は、新しいテーブルを作成します
IF @istargetexist =0
BEGIN
--EXEC のステートメントは、SQL Server の記述されたテーブル スクリプトの置換で使用できます。マージするテーブル内のフィールドと同じ名前の「自動採番」タイプのフィールドをターゲット テーブルに存在させることはできないことに注意してください。
EXEC ('CREATE TABLE [dbo].[' @TableTarget ']
(
[LOG1] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[LOG2] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
…
)')
END
tnames_cursor INTO @TableName
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
SELECT @TableName = RTRIM (@TableName)
--以下の2行をログテーブル名に合わせて変更します
--ログテーブル名の最初の3桁を識別子として取得します
SELECT @TablePref = LEFT(@TableName,3 )
--テーブル名を判断 要件を満たしているか
IF (@TablePref='log') and (@TableName>=@TableStart) and (@TableName<=@TableEnd)
--インポート開始