2013-05-15 135 views
3

我想要一个快捷的方法从'主'表和所有关联表中删除与特定'主'记录相关的所有记录。这主要是因为我可以轻松地输入测试记录,然后删除它们的所有痕迹,这需要很长时间,因为有许多表可以引用记录。从所有表中删除记录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 
+1

你试过'PRINT @ cmdstring',而不是'EXEC'和理智检查报表? –

回答

4

复制的结果从Below Query和运行查询。

declare @yourvalue varchar 
set @yourvalue='' 
select 'DELETE FROM '+ C.TABLE_NAME +' WHERE AdmissionID = '[email protected]  
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' 

你甚至可以使一个SPexecute Dynamically

+0

这是我的答案,如果您使用像@ColumnName这样的变量更改列名称(AdmissionID),它将始终可用。 –

+0

为什么?如果我将列名称作为过程的参数,它应该适用于所有表中的所有列。这是错的吗? –

+0

该查询效果很好,谢谢,但我仍然无法在SP中使用它。我已经用我正在尝试的内容更新了我原来的问题 - 请你帮我看一下吗?谢谢! –