SQL은

2012-01-14 4 views
1

나는 테이블의 이름이 :SQL은

Posts_August_2011 
Posts_September_2011 
Posts_October_2011 
Posts_November_2011 
Posts_December_2011 
Posts_January_2012 

내가 UNION 테이블을 것 저장 프로 시저를 만들려면,하지만 난 그것을 접착제 동적 SQL을 사용할 수 있기 때문에 그것은 문제가되지 않습니다 최대, 내 문제가 범위에서 일종의 목록에 개월과 연도 범위를 얻고있다? 테이블이 존재하는지 점검하고, 조합하여 리턴하십시오.

나는 주어진 범위에서 달의 각 달의 이름과 연도를 추출하는 가장 좋은 방법이 될 것입니다 무엇이 개 변수 @FromDate@Todate as datetime

를 선언 할 것입니다.

내가 범위를 지정한다고 가정하면 @FromDate = '2011-10-18 14:16:27.000' and @ToDate = '2012-01-09 14:16:27.000' 월 및 연도를 추출하는 방법을 조언 해 줄 수 있습니다. 이 문제는 불량으로 인해 발생

@SqlToExecute += 'SELECT * FROM Posts_' + extractedMonthName + '_' + extractedYear + ' UNION ALL '; 

답변

2

:로 dinamyc SQL을 사용

DECLARE @SqlToExecute as nvarchar(MAX); 

가 범위 내에 존재하는 각 표의 문자열 루프 동안 및 접착제 테이블의 존재를 확인할 수 있었다 허용 데이터베이스 설계. 이 테이블의 모든 행을 하나의 테이블 Posts에 저장하고 date 필드를 사용하여 월과 연도를 지정해야했습니다.

당신이 코드를 사용할 수 있습니다 자신의 이름에서 추출 테이블 Posts_%와 날짜의 이름을 얻으려면 :

create table Posts_August_2011(i int) 
GO 
create table Posts_September_2011(i int) 
GO 

DECLARE @SqlToExecute varchar(max) 
DECLARE @FromDate date = '20110801', @ToDate date = '20110809' 

SELECT name PostName, CAST(REPLACE(REPLACE(name,'Posts_','01/'),'_','/') as date) PostDate 
INTO #Posts 
FROM sys.tables 
WHERE name like 'Posts_%' 

SET @SqlToExecute='' 

SELECT @SqlToExecute += 'SELECT * FROM ' + PostName + ' UNION ALL ' 
FROM #Posts 
WHERE PostDate>[email protected] 
     AND PostDate<@ToDate 

SELECT SUBSTRING(@SqlToExecute,1, LEN(@SqlToExecute)-10) 

DROP TABLE #Posts 
DROP TABLE Posts_August_2011 
DROP TABLE Posts_September_2011 

sys. tables은 현재 데이터베이스의 각 테이블 개체의 행을 반환 시스템 카탈로그 뷰입니다.

+0

이 방법은 사용자 지정 파티션으로 쉽게 관리 할 수 ​​있습니다. – formatc

+0

정확히 내가 무엇을 찾고 있었는지, 고마워요 방금 조정 한 일을했습니다. 마지막으로 리턴 된 테이블의 첫 번째 결과와 같은 리터럴이 선택되었습니다. SELECT * FROM foo UNION ALL .. 추가 : SET @FinalToExec = SUBSTRING (@ SqlToExecute, 1, LEN (@SqlToExecute) -10) 드롭 테이블 # 게시물 1 EXEC (@FinalToExec) – formatc

+0

@ user1010609 답장을 보내 주셔서 감사합니다. 내가 너를 도울 수있어서 기뻐. –

0

DATENAME(month,date) 및 을 사용하여 월 및 연도 세트를 만들 수 있습니다.

연도/월 조합이있는 작은 lookuptable을 만들고 날짜 범위를 필터링하는 것이 가장 쉽습니다. 그런 다음 결과를 반복하고 쿼리를 작성하여 실행하십시오.

나중에 테이블의 크기가 분할되어있는 경우 나중에 해당 테이블을 월 분할로 파티셔닝 할 수 있습니다.

+0

그렇습니다. 현재 Im을 사용하여이 방법으로 SP를 선택했습니다.이 작업을 수행하는 주된 이유는 크기 때문에 모든 것을 결합하지 않아도되기 때문입니다. – formatc

0

게시일과 함께 [Post] 테이블에 넣을 수 있습니까? 필요한 경우 파티션을 나누시겠습니까?