-1

먼저 질문을 잊어 버리십시오.

내 질문에 대한 내 명확한 내용을 내 저장된 제품 내에서 제공하는 것이 좋습니다.

내가 목적지 테이블을 가지고 있다고 가정하자.TBLA및 원본 테이블TBLB.

1 단계 : 예를 들어 데이터베이스의 테이블에서 SQL을 가져옵니다.

--I Ran this process in a cursor that @Sql is actually a pass in selected coloum value
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = 'SELECT TBLB.coloumA, TBLB.coloumB... into ##TempTable
            FROM TBLB 
            WHERE CONVERT(VARCHAR(10),Date,120)='2011-04-05'';

EXEC sp_ExecuteSql @sql

2 단계 : 다른 sp_ExecuteSql을 호출하여 대상 테이블 데이터를 삭제합니다.

DECLARE @CheckClear NVARCHAR(MAX);
SET @CheckClear = 'DELETE FROM TBLA WHERE EXISTS(SELECT * FROM ##TempTable)';

EXEC sp_ExecuteSql @CheckClear ;
--This section is my problem describe below.

3 단계 : 임시 테이블에서 select *로 TBLA에 삽입

DECLARE @DumpSql NVARCHAR(MAX);
SET @DumpSql = 'INSERT INTO TBLA 
                SELECT * FROM ##TempTable';

EXEC sp_ExecuteSql @DumpSql ;

2 단계에서 문제가 더 자세히 설명됩니다.

기본적으로, 내가 performe 삭제 statment, 난 내 데이터의 모든 누락 된 것으로 나타났습니다 그냥 첫 번째 행을 수행하는 것만DELETE FROM TBLA...

예를 들어 senario

delete 문을 작성하기 전에 선택하기 만하려고합니다.##TempTable가치, 그것은 정확합니다. 오 그래, 2011-11-04 데이터 만 있습니다.

사실 내TBLA현재 2011-11-03 및 2011-11-02 데이터가 이미 있습니다.

추신 : 실제로 데이터를 날짜 값으로 선택합니다.

이것은 위의 SQL, 성공을 실행 ...

그리고 계속해서, 나는 내TBLA그 결과를 봅니다. 세상에! 그것만이 가지고있다.2011-11-04데이터 ... 나머지는 어디입니까 ??

점에 유의하시기 바랍니다:

이 SQL 위의 spyexecutesql 사용되는 내 dyamic 저장된 찌르다 그냥 일부입니다. 내 실제 데이터는 내가 300 테이블의 처리가 필요하고 제대로 총 300 테이블이 다른 독특한있다indentity그래서 나는 그것을 만들지 않았다.Select * From ##Temptable Where id=something

희망이 훨씬 명확하게 질문

고마워, 도움이된다.

문안 인사:

리앙크

2 답변


2

이것을 확인하십시오 : where 조건에서 하위 쿼리를 사용하여 mytable에서 행을 삭제합니다.

DELETE FROM mytable WHERE id IN (SELECT id FROM mytable2)

날짜에 따라 삭제할 고유 한 값을 찾고 있다면 임시 테이블에 고유 한 값을 작성한 다음 삭제 작업을 수행하십시오.

두 번째로 조인 작업을 기반으로 삭제 작업을 찾고 있다면 : 다음 링크를 클릭하십시오 :

SQL Server에서 INNER JOIN을 사용하여 여러 테이블에서 삭제하는 방법

SP_Execute를 사용하여 임시 테이블에 행을 삽입하는 방법을 알아 보려면 다음 링크를 확인하십시오.

SQL 서버 - 임시 테이블에 단일 행을 삽입하는 방법?

SQL2005에 하나의 명령으로 여러 행을 임시 테이블에 삽입하십시오.

이게 너를 거의 도와주지 않기를 바란다 ..


  • 답장을 보내 주셔서 감사합니다. 그러나 그것은 동적으로 적용되는 ID이기 때문에 unfortuanlly ID로 식별 할 수 없습니다. 문제에는 다른 유형의 테이블이 있습니다. 저장된 SQL 내에서이 SQL을 실행했습니다. - Worgon
  • 내 질문을 다시 볼 수 있도록 도와주세요. 잘하면 지금은 훨씬 더 분명하다. - Worgon
  • 이 문제를 해결하기 위해 앞으로 나아갈 수있는 몇 가지 링크를 업데이트했습니다. - Niranjan Singh

0

우선 TBLA의 기본 키 필드를 식별해야합니다. 나는 PK가 FLDA라고 가정한다.

임시 테이블에있는 TBLA 행에서 삭제하면 오른쪽 sintax는 다음과 같습니다.

DELETE FROM TBLA
WHERE FLDA IN 
   (SELECT ##TempTable.FLDA 
   FROM ##TempTable)

더 우아한 방법은 SQL 서버와 함께이 문제를 해결할 수 있습니다MERGE성명서:

MERGE 
    INTO  TBLA  AS target
    USING (Select * from ##TempTable)
    ON TBLA.FLDA = ##TempTable.FLDA
    [ WHEN MATCHED [ AND <clause_search_condition> ]
        THEN <merge_matched> ] [ ...n ]
    [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
        THEN <merge_not_matched> ]
    [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
        THEN <merge_matched> ] [ ...n ]
    [ <output_clause> ]
    [ OPTION ( <query_hint> [ ,...n ] ) ] 

수정 됨나는 너의 더 상세한 질문을 보았다.

실행할 때 :

DELETE FROM TBLA WHERE EXISTS(SELECT * FROM ##TempTable)

모든 데이터가 삭제됩니다. 왜냐하면 조건 allways가 True를 반환하기 때문입니다.

해결 방법은 TBLA의 모든 테이블 필드를 연결하여 ## TempTable의 모든 테이블 필드를 연결하는 것과 비교할 수 있습니다.


  • 내 질문을 다시 볼 수 있도록 도와주세요. 잘하면 지금은 훨씬 더 분명하다. - Worgon

연결된 질문


관련된 질문

최근 질문