Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL-删除数据库中早于x天的所有记录_Sql_Sql Server_Tsql - Fatal编程技术网

TSQL-删除数据库中早于x天的所有记录

TSQL-删除数据库中早于x天的所有记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的业务要求是从多个超过1年的数据库中删除中的所有记录。是否有办法在数据库级别执行此操作,或者每个表都必须编写脚本 我看到在表级别有多种方法可以做到这一点,但我想知道是否可以在数据库级别做到这一点 表级:对于希望了解如何在表级删除的任何人: 其实质是使用SQL编写SQL。这是一个起点: SELECT DISTINCT REPLACE(REPLACE(REPLACE( 'DELETE FROM {s}.{t} WHERE {c} < DATEADD(YEAR, -1, GetUtcDat

我的业务要求是从多个超过1年的数据库中删除中的所有记录。是否有办法在数据库级别执行此操作,或者每个表都必须编写脚本

我看到在表级别有多种方法可以做到这一点,但我想知道是否可以在数据库级别做到这一点

表级:对于希望了解如何在表级删除的任何人:


其实质是使用SQL编写SQL。这是一个起点:

SELECT DISTINCT REPLACE(REPLACE(REPLACE(
  'DELETE FROM {s}.{t} WHERE {c} < DATEADD(YEAR, -1, GetUtcDate())'
  '{s}', table_name),
  '{t}', table_name),
  '{c}', column_name)
FROM
  INFORMATION_SCHEMA.COLUMNS
WHERE
  column_name like '%Created%'
它在info模式中查询包含单词Created假设的所有列的列表:您的表包含名为CreatedAt、CreatedOn、CreatedDate、Created、RecordCreated等的列;根据您的场景进行调整,并将表/列名放入一个字符串中,该字符串是删除数据的SQL

运行此命令,然后将结果从网格复制到另一个查询窗口并运行它。因此,编写SQL的是SQL

在您了解了这个概念之后,您可以通过让一些程序或动态SQL选择删除查询并运行它们来实现自动化

如果您有多个数据库,还可以升级,方法是进行一个命中sys.databases的查询,以找出所有需要查询的数据库名称,然后编写一个命中数据库列表的SQL,并生成该SQL的变体,该SQL命中特定的数据库,即命中特定表以进行删除的SQL

就像《盗梦空间》;在你开始深入挖掘之前,确保你了解洋葱的最外层

请记住,您的数据可能会受到限制,这意味着您必须:

按一定顺序或顺序删除它们 继续重新运行删除操作,直到您第一次尝试删除父项时不再执行删除操作,然后子项删除操作可能会失败,因为子项存在,第二次您可能已删除所有子项,以便可以删除父项-如果仍有任何子项,此路由可能会失败,但您可能希望它失败或失败 将约束配置为“删除级联”,以便从父级删除记录会从子级删除记录 警告:这是一种严重的破坏性行为,您可能很容易删除超出预期的内容,或者使数据库处于引用完整性被破坏、应用程序停止工作的状态

这不是一个仅仅在短短5分钟的问题中轻率地设计出来的东西;这是一个长达数周的项目,以确保您只删除相关内容。例如,为delete cascade配置密钥,然后意外删除应用程序状态:Approved enum record(仅因为它在一年多前被放入数据库中)可能会删除整个数据库,删除每个已批准的应用程序(即使是昨天批准的应用程序)和来自它的每个帐户,他们所有的交易等等


仔细考虑这一点

您需要从每个表中删除行或分区,尽管您可以设置脚本来读取系统表以生成动态SQL。使用system.tables查找日期类型为date、datetime、datetime2的列。然后,检查外部约束,并根据它们的顺序构建DELETE语句。编写SQL查询的SQL名称是什么?在一个层次上,是ANNIBALISQLM。在两个层面上,头痛。在3+级,一团乱;哦,我想你可以称之为元程序设计或一些时髦的东西。试着想想,我们用计算机做的几乎每件事都是编写代码的代码,每个人都在某种程度上操作,而不是在CPU中翻转逻辑门,所以你可以称之为编程是有意义的。我刚刚在一个网站上读到关于元编程的内容。动态SQL也被认为是元编程吗。?谢谢,我想这取决于你的观点;在另一种编程语言中动态地形成一个SQL,它本质上是一个将被编译、执行并产生输出的程序,这可能符合我的要求。。但是我刚才说过,写一个C,然后把它编译成可以在硬件上运行的东西,这也是元编程,也就是编程。只有在你们和其他人的对话中,当你们都理解你们各自所说的X的意思时,什么才是真正重要的X。编译器哲学!