2017-11-19 15 views
0

방금 ​​저장 프로 시저를 작성하는 중이고 한 곳에서 심하게 붙어 있습니다.데이터 삭제 삭제 명령문 작성

기본적으로 내 저장 프로 시저는 다음과 같습니다

CREATE PROCEDURE [dbo].[DELETEGUIDTESTNEW1] 
    (@IpApplicationNumber NVARCHAR(50) = NULL) 
AS 
BEGIN 
    DECLARE @ApplicationNumber NVARCHAR(20) 

    SET @ApplicationNumber = (SELECT APPLICATIONNUMBER 
           FROM CUSTOMERROLE 
           WHERE CUSTOMERNUMBER = @IpCustomerNumber 
           AND CUSTOMERVERSIONNUMBER = @IpCustomerVersion) 

    -- In between I am doing business operation-------------------- 

    INSERT INTO dbo.DeleteTest1(Statements) 
    VALUES ('Delete from '[email protected]+' where ApplicationNumber =' + @ApplicationNumber) 

나는 런타임에 내 매개 변수를 얻을 것이다하지만 실제 문제는 내가 신청 번호를 얻기 전에 내 삭제 명령문을 구성하려는이고 나는 그런 내 삭제 명령문을 구성하려면 내 응용 프로그램 번호를 얻을 때 테이블에서 모든 delete 문을 가져와 실제 응용 프로그램 번호로 @ApplicationNumber을 바꾸고 데이터베이스에서 레코드를 삭제하는 방법.

기본적으로 응용 프로그램 번호가있는 삭제 명령문을 템플릿으로 사용하고 런타임에 레코드를 삭제하려고합니다.

도와주세요!

+1

왜 하시겠습니까? SP 또는 매개 변수가있는 쿼리를 사용하면 SQL Server에서 동일한 실행 계획을 다시 사용할 수 있습니다. 문자열 함수를 사용하여 @applicationNumber가 이미 포함 된 DELETE 문을 만드는 경우 SQL Server는 매번 새 실행 계획 *을 컴파일해야합니다. SQL 인젝션 공격의 변형 위험은 말할 것도 없습니다. (SQL 문에 해당 테이블을 작성할 수있는 모든 사용자는 거의 모든 작업을 수행 할 수 있습니다) *. 왜 너는 뭐하려고? 그것은 당신이하려고 노력해야 할 일을하려고 애 쓰고있는 것처럼 느껴집니다 ... – MatBailie

+0

왜 무엇을하려고합니까? 좋아, 그래서 내 삭제 스크립트 빌드 시간에 한 번만 실행됩니다 및 빌드 시간에 삭제 계층 구조와 템플릿 응용 프로그램 번호와 함께 삭제 스크립트를 작성하고 있습니다. 왜 내가 그것을하고있다 : - 내 응용 프로그램에 대한 데이터를 제거하는 구현 싶어요. 내 응용 프로그램 번호와 관련된 데이터베이스에서 각 행을 삭제하고 싶습니다 ... – Abhijit

+0

삭제할 응용 프로그램 번호를 특정 기준에 따라 결정하는 창 스케줄러를 갖게되며 일단 해당 기준을 충족하면 나를 보낼 것입니다 내 데이터를 제거하는 데 사용할 응용 프로그램 번호 ... – Abhijit

답변

0

글쎄, 나는 퍼지에 대한 해결책을 발견했다. 런타임 GUID 상황을 처리하기 위해 저장 프로 시저에서 저장 프로 시저를 게시했습니다.

SELECT @GuidPrimaryTableSpace = @GuidPrimaryTableSpace + DeleteGuidStatement + ';'+ CHAR(13) + CHAR(10) 
FROM ##Purge_GuidForeignKeyTablePurgeStatements 

SELECT @GuidForeignKeyTableSpace = @GuidForeignKeyTableSpace +'Insert Into @AddressRecordsToPurge (GuidValue, GuidColumn) ('+ SelectGuidStatement +');'+ CHAR(13) + CHAR(10)  
FROM ##Purge_GuidPrimaryTablePurgeStatements 

SELECT @DeleteGuidStatementSpace = @DeleteGuidStatementSpace + DeleteGuidValueStatement + ';'+ CHAR(13) + CHAR(10) 
FROM ##Purge_GuidTableNames 

SET @createProcedureCmd = 'CREATE PROCEDURE MyProc' + ' (@ApplicationNum nvarchar(50),@CustomerNumber nvarchar(50),@CustomerVersionNumber nvarchar(50)) AS ' + ' BEGIN '+  
    ' DECLARE @ApplicationNumber nvarchar(50); SET @ApplicationNumber = @ApplicationNum; 

     DECLARE @AddressRecordsToPurge TABLE 
     (
     RowID INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
     GUIDValue Nvarchar(max), 
     GUIDColumn Nvarchar(max) 
     )'+ CHAR(13) + CHAR(10) + @GuidForeignKeyTableSpace + @GuidPrimaryTableSpace + @DeleteGuidStatementSpace +' END' 

     EXEC(@createProcedureCmd) 

여기에서는 모든 선택 문을 먼저 작성하고 저장 프로 시저를 게시합니다. 런타임에 내 게시 된 저장 프로 시저에 충돌 할 때마다 먼저 모든 guid를 temp 테이블에서 찾은 다음 내 삭제를 시작합니다.

모든 입력에 감사드립니다.