从另一个 table 中的值中删除 table 中的记录的存储过程
Stored Procedure to delete records in a table from values in another table
我有 table、table A
和 table B,C,D etc
。 table A
有三列,即 id
、date
和 tracker
.
从 table A
我必须从数据类型 date
的 date
列中选择数据超过 30 天的行。根据获得的结果,我必须根据 id
和 tracker
(跟踪器列的数据将提供目标 table 的名称)在 table B,C,D etc
中记录table A
。例如 id
= 3
from table A
将从 tracker
列提供的 table B,C,D etc
中删除 id
= 3
的记录。
ID 在两个 table 中将相同。 Table B、C、D 等将有许多其他列。
所以,这里非常简单,但是
DELETE FROM [Table B]
WHERE
[Table B].[id] IN (SELECT [Table A].[id] AS [innerID]
WHERE [Table A].[date] < DATEADD(DAY, -30, GETDATE()));
它基本上会删除 Table B 中的所有记录,其中这些记录在 Table A 上具有相同的 id 值,并且日期列距今天
超过 30 天
对于其他 table,只需重复该过程即可;您还可以创建一个临时 table 变量来存储 select 并在下一个查询中使用它,如下所示:
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);
根据您的编辑,“跟踪器列的数据将提供目标 table 的名称”,您必须做这样的事情(只是暗示,没有检查所有语法):
DECLARE @query NVARCHAR(MAX)
SET @query = '' --put the entire query here (all the declarations, and run)
EXEC(@query)
这样做很危险
我有 table、table A
和 table B,C,D etc
。 table A
有三列,即 id
、date
和 tracker
.
从 table A
我必须从数据类型 date
的 date
列中选择数据超过 30 天的行。根据获得的结果,我必须根据 id
和 tracker
(跟踪器列的数据将提供目标 table 的名称)在 table B,C,D etc
中记录table A
。例如 id
= 3
from table A
将从 tracker
列提供的 table B,C,D etc
中删除 id
= 3
的记录。
ID 在两个 table 中将相同。 Table B、C、D 等将有许多其他列。
所以,这里非常简单,但是
DELETE FROM [Table B]
WHERE
[Table B].[id] IN (SELECT [Table A].[id] AS [innerID]
WHERE [Table A].[date] < DATEADD(DAY, -30, GETDATE()));
它基本上会删除 Table B 中的所有记录,其中这些记录在 Table A 上具有相同的 id 值,并且日期列距今天
超过 30 天对于其他 table,只需重复该过程即可;您还可以创建一个临时 table 变量来存储 select 并在下一个查询中使用它,如下所示:
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);
根据您的编辑,“跟踪器列的数据将提供目标 table 的名称”,您必须做这样的事情(只是暗示,没有检查所有语法):
DECLARE @query NVARCHAR(MAX)
SET @query = '' --put the entire query here (all the declarations, and run)
EXEC(@query)
这样做很危险