我想要一个快捷的方法从'主'表和所有关联表中删除与特定'主'记录相关的所有记录。这主要是因为我可以轻松地输入测试记录,然后删除它们的所有痕迹,这需要很长时间,因为有许多表可以引用记录。从所有表中删除记录ID
因此,总之,在包含名为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关系上使用级联删除。
UPDATE 继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 = '[email protected] AS cmd
,ROW_NUMBER() OVER (ORDER BY 'DELETE FROM '+ C.TABLE_NAME +' WHERE AdmissionID = '[email protected]) 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
你试过'PRINT @ cmdstring',而不是'EXEC'和理智检查报表? –