2012-11-27 2 views
0

T-SQL Dynamic SP에 관한 문제가 있습니다. 첫 번째 블록은 실패 시도이고 두 번째 블록은 내 타겟 (비 동적 블록)입니다.동등한 동적 트랜잭션 SQL 블록을 만들려면 어떻게해야합니까?

CREATE PROCEDURE UDP1_TRY_EQQQ 
(@FACTUTABLE nvarchar(100)) 
AS 
declare @sqlquery as nvarchar(100) 
BEGIN 
SET @sqlquery = 'DELETE FROM ' + @FACTUTABLE + ' WHERE ANEXO IN 
    (SELECT ANEXO FROM ' + @FACTUTABLE + ' A LEFT JOIN ALTAS_MOVILES B 
    ON A.ANEXO=B.TCNFOL WHERE B.TCNFOL IS NULL)' 
EXEC sp_ExecuteSql @sqlquery 
END 


DELETE FROM FACTURACION_201210 
WHERE ANEXO IN 
(
SELECT ANEXO 
FROM FACTURACION_201210 A 
LEFT JOIN ALTAS_MOVILES B 
ON A.ANEXO=B.TCNFOL 
WHERE B.TCNFOL IS NULL 
) 
+0

"실패 시도"는 무엇을 의미합니까? 오류 메시지가 표시되거나, 잘못된 행을 삭제하는 등의 작업을 수행합니까? 여기에 질문을 할 때 구체적으로 설명하십시오. 특정 문제를 해결하는 것보다 "작동하지 않음"을 수정하는 것이 훨씬 더 어렵습니다. –

답변

1

@sqlquery 변수에는 100 자까지 허용됩니다. 그것을 더 크게 만드십시오.

또한, 당신은 테이블 이름을 대체해야 이러한 동적 쿼리에서, 나는 두 가지 추가 조치를 취할 좋아 :

  1. 사용 QUOTENAME(). 예를 들면 : 당신이 진짜 공상을 얻고 싶은 경우에 SELECT Table_Name FROM Information_schema.Tables WHERE Table_Name = @FACTUTABLE;

, 당신은 또한 테이블이 있는지 확인 할 수 있습니다 : @sql = 'Select * FROM ' + QuoteName(@table);

  • INFORMATION_SCHEMA 테이블의 이름을 조회, 확인 할 수는없는거야 원인은 구문 오류입니다 올바른 스키마에 넣고 심지어 information_schema.columns를 검사하여 선택한 테이블에 올바른 열 이름이 있는지 확인하십시오. 일반적으로이 처음 두 검사는 제가가는 한도 내입니다.

  • +1

    좋은 눈 조엘, +1. 'QUOTENAME()'을 사용하면 대괄호를 명시 적으로 추가하는 것보다 훨씬 안전하다고 제안 할 것입니다. –

    +0

    좋은 조엘. 모든 작품. –

    +0

    좋은 전화 @AaronBertrand, 업데이트 됨. –

    관련 문제