【问题标题】:Stored Procedure to delete records in a table from values in another table从另一个表中的值中删除表中的记录的存储过程
【发布时间】:2022-01-18 00:53:27
【问题描述】:

我有桌子,table Atable B,C,D etctable A 有三列,即iddatetracker

table A 我必须从数据类型为datedate 列中选择数据超过30 天的行。从获得的结果中,我必须根据idtracker(跟踪器列的数据将提供目标表名称)从table Atable B,C,D etc 中的DELETE 记录。例如id = 3 from table A 将删除table B,C,D etc 提供的tracker 列提供的id = 3 的记录。

两个表中的 ID 将相同。表 B、C、D 等将有许多其他列。

【问题讨论】:

  • 消耗性样本数据、预期结果,您的尝试将帮助我们帮助您。表格也没有“记录”,它们有行和列。
  • 我认为您不需要为此设置程序。只需一个普通的旧 DELETE 语句即可涵盖它。请分享样本数据和期望的结果,以便我们提供更多帮助。
  • 这与存储过程无关,它只是一个查询;编写查询以识别目标记录,可能使用exists,一旦它返回正确的行将其转换为删除语句。
  • 抱歉有误。 'tracker' 列数据将是必须从中删除 ID 的表的名称。我们可以将表名作为参数传递吗?
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql sql-server tsql stored-procedures


【解决方案1】:

所以,这里非常简单,但是

DELETE FROM [Table B]
WHERE
    [Table B].[id] IN (SELECT [Table A].[id] AS [innerID]
                       WHERE [Table A].[date] < DATEADD(DAY, -30, GETDATE()));

它基本上会删除表 B 中的所有记录,其中这些记录在表 A 上具有相同的 id 值,并且日期列从今天起超过 30 天

对于其他表,只需重复该过程;您还可以创建一个临时表变量来存储该选择并在下一个查询中使用它,如下所示:

DECLARE @ids TABLE(id INT);
INSERT INTO @ids(id)
  SELECT [Table A].[id] AS [innerID]
  WHERE [Table A].[date] < DATEADD(DAY, -30, GETDATE());
DELETE FROM [Table B] WHERE [Table B].[id] IN (SELECT id FROM @ids);
DELETE FROM [Table C] WHERE [Table C].[id] IN (SELECT id FROM @ids);
DELETE FROM [Table D] WHERE [Table D].[id] IN (SELECT id FROM @ids);

根据您的编辑,“跟踪器列的数据将提供目标表名称”您必须执行类似的操作(只是提示,尚未检查所有语法):

DECLARE @query NVARCHAR(MAX)
SET @query = '' --put the entire query here (all the declarations, and run)
EXEC(@query)

这样做很危险

【讨论】:

  • 感谢您为我指路。我仍然没有解决方案,但现在清楚如何进行此操作。我一定会弄清楚并回到这里。
猜你喜欢
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多