当前位置: 首页 > 面试题库 >

SQL存档脚本

张建树
2023-03-14
问题内容

我正在尝试将记录从数据库中的表存档到存档数据库中的相同表。我需要能够对日期大于三年前的所有记录进行插入,然后删除这些行。但是,此表有数百万条处于活动状态的记录,因此我想一次在大约100到1000个块的循环中运行它。到目前为止,我的存储过程执行了整个插入语句,然后执行了删除语句(在事务中),该语句具有与插入语句基本相同的WHERE子句。我的WHILE循环正在查找表中最早的日期,以确定循环何时完成。其中一些似乎效率很低。有没有一种方法可以对记录块进行插入和删除,而不必在同一循环执行中对它们进行两次查找?有没有更好的方法来确定WHILE语句何时完成?运行MS
SQL Server 2000。

这是我当前的过程(ISAdminDB是主数据库,ISArchive是归档数据库):

    WHILE ( (SELECT MIN( [MyTable].[DateTime]) FROM  [ISAdminDB].[dbo].[MyTable]) < DATEADD(d, -(3 * 365), GetDate()))
BEGIN

INSERT INTO [ISArchive].[dbo].[MyTable] 
(<Fields>)
SELECT TOP 1000 (<Fields>)
FROM  [ISAdminDB].[dbo].[MyTable]
WHERE 
   [MyTable].[DateTime] < DATEADD(d, -(3 * 365), GetDate())
AND  UniqueID in (SELECT TOP 1000 UniqueID  FROM  [ISAdminDB].[dbo].[MyTable] ORDER BY [MyTable].[DateTime] ASC )

BEGIN TRAN
DELETE FROM  [ISAdminDB].[dbo].[MyTable]
WHERE   [MyTable].[DateTime] < DATEADD(d, -(3 * 365), GetDate()) 
AND  (UniqueID in (SELECT TOP 1000 UniqueID FROM  [ISAdminDB].[dbo].[MyTable] ORDER BY [MyTable].[DateTime] ASC))
COMMIT

END

问题答案:

首先,您要删除3年前的特定日期的记录。您不在乎删除它们的顺序,只需要继续删除它们,直到没有剩余的为止。您还可以通过使用临时表存储ID,将截止日期存储在变量中并重复引用它来加快处理速度。

现在我们有了:

DECLARE @NextIDs TABLE(UniqueID int primary key)
DECLARE @ThreeYearsAgo datetime
SELECT @ThreeYearsAgo = DATEADD(d, -(3 * 365), GetDate())

WHILE EXISTS(SELECT 1 FROM [ISAdminDB].[dbo].[MyTable] WHERE [MyTable].[DateTime] < @ThreeYearsAgo)
BEGIN 
    BEGIN TRAN

    INSERT INTO @NextIDs(UniqueID)
        SELECT TOP 1000 UniqueID FROM [ISAdminDB].[dbo].[MyTable] WHERE [MyTable].[DateTime] < @ThreeYearsAgo

    INSERT INTO [ISArchive].[dbo].[MyTable] (<Fields>) 
        SELECT (<Fields>) 
        FROM  [ISAdminDB].[dbo].[MyTable] AS a
        INNER JOIN @NextIDs AS b ON a.UniqueID = b.UniqueID

    DELETE [ISAdminDB].[dbo].[MyTable]
    FROM  [ISAdminDB].[dbo].[MyTable] 
    INNER JOIN @NextIDs AS b ON a.UniqueID = b.UniqueID

    DELETE FROM @NextIDs

    COMMIT TRAN
END


 类似资料:
  • 问题内容: 我想在解决方案中存储冗长的.sql脚本并以编程方式执行它们。我已经想出了如何执行包含我的sql脚本的字符串,但是还没有想出如何从解决方案中存储的文件中读取字符串(例如,在/ Scripts子文件夹下)。 问题答案: 首先,编辑.sql文件的属性,以便将其作为资源嵌入。 然后使用类似于以下代码的代码来检索脚本:

  • 问题内容: 我有一个脚本,可以用来构造表和存储过程。例如,我有一个类型为的列。需要一个size参数,该大小我也用作存储过程以及这些过程中的参数。 是否有可能具有a的等价形式,因此我可以轻松调整大小而无需在整个脚本中进行更改? 我正在使用MySql工作台。 编辑 我曾尝试和 我有一个脚本-这是(删节的) 我想要实现的是用一个 常量 替换脚本中的值25-类似于创建表和存储过程的脚本顶部的a ,因此我能

  • 问题内容: 我想用。像这样从存储的过程中调用sql脚本… 我收到“无法打开’test.sql;’的消息” 我以这种方式运行时出错。我也尝试过!但随后出现权限被拒绝错误。但是,我无法消除;; 或整个事情坏了。有没有解决的办法? 我究竟做错了什么? 问题答案: mysql客户端内置了一组命令。它们记录在“ 命令 ” 下。这些包括DELIMITER,SOURCE,HELP,CONNECT,USE,QUI

  • 问题内容: 我会解释一个模糊的标题。 我正在编写一个SQL脚本来为数据库中表的每一行创建一个插入语句,纯粹是为了能够将该数据应用回另一个数据库。 这是我目前所拥有的: 它的效果很好,输出如下: 问题是,如果字段之一为空,则该行将无法生成更新脚本,在输出文件中,该行仅是空白。显然,由于有20多个字段,因此一些可选内容意味着几乎不会生成我的任何脚本。 有没有办法解决这个问题? 问题答案: 对于NULL

  • 问题内容: 如何自动执行给定文件夹中所有SQL脚本的运行过程? 问题答案: 编写Windows脚本,使用FOR构造遍历文件,并使用SQLCMD实用程序执行每个文件。

  • 问题内容: 我面临一个非常烦人的问题。我已经在Notepad ++中编写了一些SQL脚本。现在,当我尝试通过SQL * Plus(在Windows 7上通过命令行)执行它们时,出现诸如的错误。 然后,我将脚本复制并粘贴到“ SQL Developer工作表”窗口中,单击“运行”按钮,脚本执行成功,没有任何问题/错误。 经过长时间的调查,我开始认为SQL * Plus的某些空白(包括换行符和制表符)

  • 本文向大家介绍SQL SERVER数据库的作业的脚本及存储过程,包括了SQL SERVER数据库的作业的脚本及存储过程的使用技巧和注意事项,需要的朋友参考一下 用系统存储过程去创建作业,代码如下: Transact-SQL 参考 本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

  • 问题内容: 假设我编写了创建表ABC的脚本Table_ABC.sql。我为每个必需的表创建了许多这样的脚本。现在,我想编写一个脚本,该脚本按顺序调用所有这些脚本文件,因此基本上我想要另一个脚本文件createTables.sql。Mysql提供了从“ mysql” shell应用程序执行脚本文件的选项,但可以找到一些命令,例如 exec c:/myscripts/mytable.sql 。请告诉我