gpt4 book ai didi

sql - 从所有表中按 ID 删除记录

转载 作者:行者123 更新时间:2023-12-04 02:56:40 25 4
gpt4 key购买 nike

我想要一种快速的方法来从“主”表和所有关联表中删除与特定“主”记录相关的所有记录。这主要是为了让我可以轻松地输入测试记录,然后删除它们的所有痕迹,考虑到记录可以引用的表有几十个,手动操作需要很长时间。

因此,总而言之,在任何包含名为 AdmissionID 的列的表中,我想删除 AdmissionID 等于我将指定的值的所有记录。我以为我可以很容易地做到这一点。这是我的存储过程:

ALTER PROCEDURE [Admin].[sp_RemoveByAdmissionID]

@admissionID int

AS
--Removes records from all tables relating the AdmissionID entered

DECLARE @loop INT
DECLARE @object sysname
DECLARE @cmdstring varchar(500)

IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL
BEGIN
DROP TABLE #TEMP
END

SELECT
TABLE_NAME
,ROW_NUMBER() OVER (ORDER BY TABLE_NAME) ROWID
INTO #TEMP
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'

WHILE @loop <= (SELECT MAX(ROWID) FROM #TEMP)
BEGIN
SELECT @object = TABLE_NAME FROM #TEMP WHERE ROWID = @loop
IF EXISTS (SELECT * FROM SYS.COLUMNS WHERE Name = 'AdmissionID' AND Object_ID = Object_ID(@object))
BEGIN
SET @cmdstring = 'DELETE FROM ' + @object + ' WHERE AdmissionID = ' + @admissionID
Exec(@cmdstring)
END
SET @loop += 1
END

不幸的是,执行此过程不会从任何地方删除任何记录。我怀疑问题可能与我的参数没有包含在我构建 cmdstring 字符串的行中的引号中有关,但即使尝试对此进行缓解似乎也没有用。

关于我哪里出错的任何建议,或者是否有更简单的方法来做到这一点?我不想在我的 PK-FK 关系上使用级联删除。


更新按照 Luv 的建议,我发现他的查询确实返回了一个非常好的列表,其中列出了我想要使用的确切命令。我认为从那里开始会很容易,但我仍然无法完成这项工作。我正在尝试的新 SP 如下:

ALTER PROCEDURE TEST

@admissionID VARCHAR(10)

AS

DECLARE @loop INT
DECLARE @cmd VARCHAR(500)


IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL
BEGIN
DROP TABLE #TEMP
END

SELECT 'DELETE FROM '+ C.TABLE_NAME +' WHERE AdmissionID = '+@admissionID AS cmd
,ROW_NUMBER() OVER (ORDER BY 'DELETE FROM '+ C.TABLE_NAME +' WHERE AdmissionID = '+@admissionID) ROWID
INTO #TEMP
FROM INFORMATION_SCHEMA.COLUMNS C
INNER JOIN INFORMATION_SCHEMA.TABLES T on C.TABLE_NAME=T.TABLE_NAME
WHERE C.COLUMN_NAME='AdmissionID'
AND T.TABLE_TYPE='BASE TABLE'

WHILE @loop <= (SELECT MAX(ROWID) FROM #TEMP)
BEGIN
SELECT @cmd = cmd
FROM #TEMP
WHERE ROWID = @loop

EXEC(@cmd)
SET @loop += 1
END

最佳答案

Below Query 复制结果并运行查询。

declare @yourvalue varchar
set @yourvalue=''
select 'DELETE FROM '+ C.TABLE_NAME +' WHERE AdmissionID = '+@yourvalue 
from INFORMATION_SCHEMA.COLUMNS C
INNER JOIN INFORMATION_SCHEMA.TABLES T on C.TABLE_NAME=T.TABLE_NAME
where C.COLUMN_NAME='AdmissionID'
and T.TABLE_TYPE='BASE TABLE'

您甚至可以创建一个SP动态执行

关于sql - 从所有表中按 ID 删除记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16569061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com