2017-03-20 4 views
1

입력 범위로 ID 범위를 가져 와서 해당 범위의 모든 개체 (시작 및 끝 포함)를 삭제하는 SQL Server에서 함수를 만들려고합니다.SQL 삭제 개체 및 ID 범위

의 예를 들어 보자 :

delete_objects_with_id(id_start,id_end) 

그것은 범위 id_start 및 id_end의 ID로 모든 개체를 삭제합니다.

문제는 ID가 다음과 같은 형식으로되어 있다는 것입니다. id_start=2017-0001id_end=2017-0050 주어진 범위에서 반복되는 SQL Server 기능이 있습니까?

first_issue content id 
2011-01-01 test 2011-0001 
2012-10-01 test 2012-0001 
2012-11-01 test 2012-0002 
2012-11-01 test 2012-0003 
+1

샘플 데이터에는 "범위 주어진 목록에 반복 SQL 서버 기능이"없다을 보이는 군. –

+0

varchar입니까? –

+0

@ZoharPeled 네, 그것은 varchar입니다. – Kerby82

답변

1

아니요, 주어진 범위에서 반복되는 SQL Server 기능이 내장되어 있지 않습니다.

id 값이 항상 네 자릿수, 대시 및 네 자릿수 형식 인 경우 문자 문자열과 비교하면 id 값을 얻을 수 있습니다. 당신이 그 범위에있는 ID 값을 반환하는 쿼리 (SQL SELECT 문을) 쓸 수있다

,

SELECT t.id 
    FROM myobjects t 
WHERE t.id >= '2017-0001' 
    AND t.id <= '2017-0050' 
ORDER BY t.id 

그 쿼리

, 당신은 (반복 처리를 통해 커서 루프, 루프를 정의 할 수 있습니다) 반환 된 해당 ID 값을 통해.

값이 표준 형식이 아닌 경우 범위 작업이 반드시 작동하지 않을 수 있습니다. id 값을 정규 값으로 변환하는 메커니즘이 필요하므로 범위를 수행 할 수 있습니다.

그러나 "개체"가 테이블의 "행"을 참조하는 경우 왜 반복 할 필요가 있을지 (또는 원하는지) 알 수 없습니다. 이러한 행을 반환하는 SELECT 문을 작성할 수 있다면 동일한 술어를 사용하여 DELETE 문을 작성하고 하나의 행을 삭제할 수 있습니다.

DELETE 
    FROM myobjects 
WHERE id >= '2017-0001' 
    AND id <= '2017-0050' 

달성하려는 시도가 무엇인지, 왜 반복해야하는지 분명하지 않습니다. 그러나 커서 루프는이를 수행하는 한 가지 방법입니다.


다시 말하지만, 당신이 묻는 질문에 대답 : 아니요 정말 어떤 데이터를 전달하는 데 유용한 표 형식으로

1

그냥 - 캐릭터와 캐스트 ID를 제거하는 간단한 해결 방법은 같은 BIGINT (이 아이디의 첫 번째 부분은 year 값이 두 번째 부분은 매년에 대한 id이라고 가정 작동합니다)

DELETE FROM TABLE_1 
    WHERE CAST(REPLACE(id,'-','') as BIGINT) >= CAST(REPLACE(id_start,'-','') as BIGINT) 
    AND CAST(REPLACE(id,'-','') as BIGINT) <= CAST(REPLACE(id_end,'-','') as BIGINT) 

또는 사용 BETWEEN

DELETE FROM TABLE_1 
    WHERE CAST(REPLACE(id,'-','') as BIGINT) BETWEEN CAST(REPLACE(id_start,'-','') as BIGINT) 
    AND CAST(REPLACE(id_end,'-','') as BIGINT) 
,
+1

마음이 두텁기 때문에 마음이 편해졌습니다 :-) –