Technical Article

DTS-Less and Jobless Approach to Table Freshness

,

How about getting the data when the table data is first queried?  The following script checks to see if the specified table (@MyTable) has been updated today.  If so, just return the data found.  If not, then get the data from a "fresher source".  Great for ASP that performs table reporting and needs "baked daily" fresh data.
SQL2K only.

/***
    *   Date:         4/23/2002
    *   Author:       <mailto:mikemcw@4segway.biz>
    *   Project:      Data Refresh Project
    *   Location:     Any User Database
    *   Permissions:  PUBLIC EXECUTE
    *   
    *   Description:  Determines if a table has been updated today.
    *                 Truncates MyTable and refreshes it from
    *                 another table.
    *
    *   Restrictions:  SQL Server 2000 ONLY
    *                   property.
    *   
    ***//*
   Directions:
      Create a table, any old table will work. (remember to 
         put the name of the table @MyTable Variable)
         This will be the table to accept the extended property.

      Create a data source table.  Most likely a production table
      you would normally do a DTS job from. I use a linked production 
      server as a remote data source. Then I use the following:
       (also see code below)

      TRUNCATE TABLE MYTABLE
      SELECT * INTO MyTable FROM OPENQUERY(MyLinkedServer, 
         'select  col1, col2, col3, col4 FROM SomeTable WHERE col1 =1')

      Make sure all TODO sections are complete.

      Enjoy!   www.4segway.biz

*/SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO
CREATE FUNCTION udf_NeedsUpdate(
   @ObjectType VARCHAR(255), 
   @ObjectName VARCHAR(255), 
   @Today VARCHAR(10))
RETURNS INT
AS
   /***
    *   Date:         4/23/2002
    *   Author:       <mailto:mikemcw@4segway.biz>
    *   Project:      Data Refresh
    *   Location:     User Database
    *   Permissions:  PUBLIC EXECUTE
    *   
    *   Description:  Determines if a table has been updated today.
    *   
    *   
    *   Restrictions:  Object calling this must remove and add extended
    *                   property.  SQL Server 2000 ONLY
    *   
    ***/BEGIN

   --Usage:  select dbo.udf_NeedsUpdate('table','MyTableName',getdate())
   --Function Returns 0 if no update is needed
   --                 1 if the property needs to be added
   --                 3 if the property needs to be dropped, then re-added

   DECLARE @LastUpdate   VARCHAR(10)
   DECLARE @bNeedsUpdate INT

   SET @bNeedsUpdate = 0

  --Test to see if the table has been updated using Extended Properties
   IF EXISTS(SELECT VALUE FROM ::fn_listextendedproperty('LastUpdated', 'user', 'dbo', 
            @ObjectType, @ObjectName, NULL, NULL))
      BEGIN   --The property exists

        --Test to see if the table was updated today
         SELECT @LastUpdate = CAST(VALUE AS VARCHAR) 
            FROM ::fn_listextendedproperty('LastUpdated', 'user', 'dbo', 
                  @ObjectType, @ObjectName, NULL, NULL)

         IF RTRIM(@LastUpdate) <> RTRIM(@Today)
            BEGIN
               --Nope, the table's old, tell the 'client' to delete the property and
               -- update the data
               SET @bNeedsUpdate = 3
            END  
      END
   ELSE
      BEGIN
         --No Valid Extended Property, tell the client to create the property
         SET @bNeedsUpdate = 1
      END
  RETURN @bNeedsUpdate
END
GO
GRANT EXECUTE ON udf_NeedsUpdate TO PUBLIC
GO 
ALTER PROC usp_GetLatestMyTableInfo
AS
BEGIN
   /***
    *   Date:         4/23/2002
    *   Author:       <mailto:mikemcw@4segway.biz>
    *   Project:      Data Refresh Project
    *   Location:     Any User Database
    *   Permissions:  PUBLIC EXECUTE
    *   
    *   Description:  Gets the latest data from a table if table
    *                  has not been updated today.
    *
    *   Restrictions:  SQL Server 2000 ONLY
    *                   property.
    *   
    ***/
   DECLARE @Today        VARCHAR(10)
   DECLARE @bNeedsUpdate INT
   DECLARE @MyTable      NVARCHAR(255)
   DECLARE @SQL          VARCHAR(300)
   SET NOCOUNT ON
   SET @MyTable = 'MyTable' --TODO: Change this value to the table you wish to use

   --If you run into trouble or want to test more than once daily, you can use this to remove the property.  
   --  Just replace @mytable with the a quoted table name. ie.  'mytable' 
   --EXEC sp_dropextendedproperty N'LastUpdated', N'user', N'dbo', 'table', @MyTable,NULL,NULL

   --Construct a date ie: 4-23-2002
   SET @Today = CAST(MONTH(GETDATE()) AS VARCHAR(2)) + '-' + CAST(DAY(GETDATE()) AS VARCHAR(2)) + 
         '-' + CAST(YEAR(GETDATE()) AS VARCHAR(4))

   --See if the table has been updated today
   SELECT @bNeedsUpdate = dbo.udf_NeedsUpdate('table', @MyTable, @Today)
   --DEBUG: SELECT @bNeedsUpdate
   IF @bNeedsUpdate > 0
      BEGIN
        PRINT 'Table needs updated'
         --No the table has not been updated
         IF @bNeedsUpdate = 3 --3 Means there is a value, we need to drop the old one first
            BEGIN
               PRINT 'Property already exists... dropping property'
               EXEC sp_dropextendedproperty N'LastUpdated', N'user', N'dbo', 'table', @MyTable,NULL,NULL 
            END         

         --Update mytable from other source. (Copy the data)
         SET @SQL = 'TRUNCATE TABLE ' + @MyTable  --Trash the old
         EXEC(@SQL)

         --Get the New! TODO: put your copy statement here, these are examples
         --   INSERT INTO mytable (SELECT * FROM OtherTable)
         --OR
         --  SELECT * INTO MyTable FROM OPENQUERY(MyLinkedServer, 
         --  'select  col1, col2, col3, col4 FROM SomeTable WHERE col1 =1')

         PRINT 'Copying data from source to ' + @MyTable

         --Add the lastupdated the property
         EXEC sp_addextendedproperty N'LastUpdated', @Today, N'user', N'dbo', N'table', @MyTable
      End
   ELSE
      BEGIN
        PRINT 'Table has already been updated today, just select the data'
      END
   PRINT 'Results:'
   --TODO: Create your query for the results
   SET @SQL = 'SELECT COUNT(*) FROM ' + @MyTable
   EXEC(@SQL)

END
GO
GRANT EXECUTE ON usp_GetLatestMyTableInfo TO PUBLIC
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating