3

「マスター」テーブルと関連するすべてのテーブルの両方から、特定の「マスター」レコードに関連するすべてのレコードをすばやく削除する方法が必要です。これは主に、テスト レコードを簡単に入力してから、それらのすべてのトレースを削除できるようにするためです。レコードを参照できるテーブルが多数ある場合、手作業では長い時間がかかります。

したがって、要約すると、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
4

1 に答える 1