2009-07-05 3 views
2

테이블/뷰를 반복하고 일정 기준에 따라 일부 프로세스를 시작 (예 : 작업 실행, 전자 메일 보내기)하고 싶습니다. 여기SQL Server - 테이블/뷰의 행 단위 작업을 수행하기위한 표준 패턴

내 임의의 제약

는 커서를이 시나리오 필요합니까 등, 나는 저장된 프로 시저, 트리거에 T-SQL을 사용하여 데이터베이스 자체 내에서이 작업을 수행 할 수 있다는 것입니다, 또는 다른 기본 T가 -SQL 행 기반 작업을 활용할 수 있습니까?

답변

1

가장 좋은 건 커서입니다. SQL은 선언적이며 집합 기반이므로 SQL에 강제적 인 행 지향 연산을 수행하도록하는 모든 해결책은 신뢰할 수 없으며 중단 될 수 있습니다. 예 : 옵티마이 저는 실행에서 '연산'을 잘라내거나 이상한 순서로 또는 예상치 못한 횟수로 처리 할 수 ​​있습니다.

커서가 얻는 일반적인 나쁜 이름은 개발자가 동일한 기능을 수행 할 수 있도록 설정된 지향적 인 방법을 찾지 못했기 때문에 집합 기반 연산 (예 : 계산 및 업데이트 또는 보고서 반환) 대신 배포 된 경우입니다. 그러나 비 SQL 연산 (즉, 프로세스를 시작)의 경우에는 적절합니다.

결과 집합을 반복하는 클라이언트 측과 같이 커서 테마에 약간의 변형을 사용할 수도 있습니다. 이는 명시 적 커서를 사용하지는 않지만 커서와 매우 유사합니다.

1

표준 방법은 SSIS입니다. 행을 가져 오려면 SQL 실행 태스크를 사용하고 행마다 한 번씩 반복 할 경우에는 각 작업 컨테이너를 사용하십시오. 컨테이너 내부에서 원하는 작업을 실행하면 각 행의 열에 액세스 할 수 있습니다.

+0

(나는 몇 가지 점에서 능력을 원하는 가정 처리량을 높이기 위해 jobs 테이블에 대해 여러 개의 동시 ssis 작업을 실행하십시오.) 경합을 피하기 위해 임시 "진행 중"플래그가 필요하다고 생각합니다. ssis가 나를 위해 처리 할 수있는 것이거나 여전히이 논리를 직접 구현해야합니까? – Howiecamp

+0

@Howiecamp : 무슨 뜻인지 모르겠다. SQL 실행 태스크는 행을 포함하는 결과 집합을 생성합니다. For Each 작업은 행당 한 번 작동합니다. 각 행이 한 번만 작동하도록하기 위해 수행해야 할 다른 작업은 무엇입니까? –

0

전자 메일 주소 (또는 유사한 행 기반 작업)로 각 레코드에 전자 메일을 보내려는 경우 실제로 커서를 사용할 계획입니다.

SQL 자체 내에서 수행하는 다른 "행 기반"작업은 없습니다 (비록 SQL Server Standard 또는 Enterprise를 사용하는 경우 SSIS를 조사하기위한 John의 제안을 좋아하지만). 그러나 합산, 검색 또는 다른 종류의 작업을 수행 한 다음 전체 선택 세트를 완료 한 후에 이벤트를 시작하면 커서를 사용하지 않을 것입니다. 커서는 일반적으로 SQL Server의 문제에 대한 "최후의 수단"으로 간주됩니다.

+0

<< 커서는 일반적으로 SQL Server의 문제에 대한 "최후의 수단"으로 간주됩니다. >> 왜? – Howiecamp

+0

커서를 사용할 때 일반적으로 성능에 영향을 미치므로 가능하면 피하는 것이 가장 좋습니다. –

+1

올바른 종류의 조작을 위해 커서를 사용하는 것은 완벽하게 괜찮습니다. 문제는 SQL을 처음 사용하는 사람들은 집합 연산 (예 : 일부 기준에 따라 한 테이블에서 다른 테이블로 레코드의 하위 집합 이동)을 사용하여 실제로 더 잘 수행되는 작업을 수행하기 위해 커서를 사용하는 경우가 많다는 것입니다. 따라서 숙련 된 SQL 개발자는 잘못된 경로에서 시작하도록 두려워서 새 이주자에게 추천하는 것을 주저합니다. 나는 * I * 그들을 결코 사용하지 않는다고 말하면 나는 거짓말을했다. ;-) –

0

쿼리의 결과 집합을 반복 할 때 가장 먼저 생각할 것은 커서를 사용하는 것입니다. 그렇습니다. 프로그래밍의 빠르고 더러운 방법입니다. 그러나 커서에는 장애가 있습니다. 오버 헤드가 발생하고 성능 병목이 될 수 있습니다.

커서 사용에 대한 대안이 있습니다. ID 컬럼이있는 임시 테이블을 사용해 볼 수 있습니다. 테이블을 임시 테이블에 복사하고 while 루프를 사용하여 행을 반복합니다. 그런 다음 조건에 따라 저장 프로 시저를 호출하십시오.

다음

이 커서 대안에 대한 링크를 확인 - 나는 각 행은 한 번만에 운영됩니다 수 있도록 얼마나, SSIS를 사용 @ 존 http://searchsqlserver.techtarget.com/tip/0,289483,sid87_gci1339242,00.html

환호

+0

나는 당신이하는 말의 단서가 없다는 것을 인정해야한다. 결과를 임시 테이블에 복사하면 여전히 반복해야합니다. While 루프는 커서를 사용하여 * 반복하거나 조건을 지속적으로 테스트하는 동안 유용 할 수 있지만 특정 행의 데이터를 선택하고 (예 : 이메일을 보내는 등) 어떤 도움을 줍니까? –

+0

예, 임시 테이블을 반복하기 위해 반복이 수행되는 것은 사실입니다. 실제로 SQL Server 자체도 메모리 내 임시 테이블을 만들어 커서를 구현합니다. 그런 다음 SQL 연결이 닫힐 때까지 리소스가 차지하게되는 커서를 닫지 못하는 것과 같은 경고가 있습니다. 특정 열의 데이터는 ID 열의 'where'절을 사용하여 임시 테이블에서 select 쿼리를 사용하여 테스트 할 수 있으며 while 루프는 ID 열의 값을 행 개수와 비교하여 검사합니다. 이게 도움이 되길 바란다. – Arnkrishn

관련 문제