0

サードパーティの SQL Server 2008 データベースを調べています。このデータベースには、CREATED_DATETIME と UPDATED_DATETIME の 2 つの列があり、これらはほとんどのテーブルに存在しますが、おそらくすべてではありません。

これらの 2 つの列を持つデータベース内のすべてのテーブルで、これらの 2 つの列の最小値と最大値を見つけたいと考えています。これにより、データベース内のデータがどの期間からどの期間までのものであるかがかなりわかります。

どうすればそのようなクエリを書くことができますか?

4

4 に答える 4

2

次のようなものが機能するはずです

DECLARE @C1           AS CURSOR,
        @TABLE_SCHEMA SYSNAME,
        @TABLE_NAME   SYSNAME,
        @HasCreated   BIT,
        @HasUpdated   BIT,
        @MaxDate      DATETIME,
        @MinDate      DATETIME,
        @SQL          NVARCHAR(MAX) 

SET @C1 = CURSOR FAST_FORWARD FOR 
SELECT TABLE_SCHEMA,
       TABLE_NAME,
       COUNT(CASE
               WHEN COLUMN_NAME = 'CREATED_DATETIME' THEN 1
             END) AS HasCreated,
       COUNT(CASE
               WHEN COLUMN_NAME = 'UPDATED_DATETIME' THEN 1
             END) AS HasUpdated
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  COLUMN_NAME IN ( 'CREATED_DATETIME', 'UPDATED_DATETIME' )
GROUP  BY TABLE_SCHEMA,
          TABLE_NAME 


OPEN @C1;

FETCH NEXT FROM @C1 INTO @TABLE_SCHEMA , @TABLE_NAME , @HasCreated , @HasUpdated ;
WHILE @@FETCH_STATUS = 0
BEGIN

SET @SQL = N'
SELECT @MaxDate = MAX(D),
       @MinDate = MIN(D)
FROM   ' + QUOTENAME(@TABLE_SCHEMA) + '.' + QUOTENAME(@TABLE_NAME) + N' 
       CROSS APPLY (VALUES ' + 
                  CASE WHEN @HasCreated = 1 THEN N'(CREATED_DATETIME),' ELSE '' END + 
                  CASE WHEN @HasUpdated = 1 THEN N'(UPDATED_DATETIME),' ELSE '' END + N'
                           (@MaxDate),
                           (@MinDate)) V(D) 

'

EXEC sp_executesql 
    @SQL,
    N'@MaxDate datetime OUTPUT, @MinDate datetime OUTPUT', 
    @MaxDate = @MaxDate OUTPUT, 
    @MinDate = @MinDate OUTPUT

  FETCH NEXT FROM @C1 INTO @TABLE_SCHEMA , @TABLE_NAME , @HasCreated , @HasUpdated ;
END

SELECT @MaxDate AS [@MaxDate], @MinDate AS [@MinDate]
于 2013-03-09T09:10:29.867 に答える
0

このスクリプトをSSMSで実行します(CTrl+T= text results、F5= execute query):

SET NOCOUNT ON;

SELECT  'SELECT MIN(' 
        + QUOTENAME(c.COLUMN_NAME)
        + ') AS ' 
        + QUOTENAME('Min '+c.TABLE_NAME+'.'+c.COLUMN_NAME)
        + ', MAX('
        + QUOTENAME(c.COLUMN_NAME)
        + ') AS ' 
        + QUOTENAME('Max_'+c.TABLE_NAME+'.'+c.COLUMN_NAME)       
        + CHAR(13)
        + 'FROM ' + QUOTENAME(c.TABLE_SCHEMA)+'.'+QUOTENAME(c.TABLE_NAME)
FROM    INFORMATION_SCHEMA.COLUMNS c
WHERE   c.COLUMN_NAME IN ('CREATED_DATETIME', 'UPDATED_DATETIME')
ORDER BY c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME;

SET NOCOUNT OFF;

別のスクリプトが生成されます。生成されたスクリプトを実行します。

例(データベースおよび列名masterが>のすべてのテーブル用に生成されたスクリプト):lowWHERE c.COLUMN_NAME IN (N'low')

SELECT MIN([low]) AS [Min spt_fallback_dev.low], MAX([low]) AS [Max_spt_fallback_dev.low]
FROM [dbo].[spt_fallback_dev]
SELECT MIN([low]) AS [Min spt_values.low], MAX([low]) AS [Max_spt_values.low]
FROM [dbo].[spt_values]
于 2013-03-09T09:14:49.440 に答える
0
select MIN(CREATED_DATETIME) MinCREATED_DATETIME_Table1, MAX(CREATED_DATETIME) MaxCREATED_DATETIME_Table1, MIN(CREATED_DATETIME) MinCREATED_DATETIME_Table2, MAX(CREATED_DATETIME) MaxCREATED_DATETIME_Table2 from Table1, Table2
于 2013-03-09T08:59:33.830 に答える
0

以下のリンクに記載されているスクリプトを実行します。要件に応じて、わずかに変更する必要があります。

すべてのテーブルとフィールドを検索するスクリプト

于 2013-03-09T08:58:15.207 に答える