2011-09-13 7 views
2

안녕하세요, 저는 지금 당분간이 문제를 해결해 왔습니다! 날짜가있는 일부 데이터 파일이 준비 테이블에 덤프됩니다. 스크립트/함수가 수행해야하는 작업은 준비 테이블의 각 레코드에 대한 날짜를 읽고 적절한 테이블로 이동하는 것입니다. 지금은 내가 그것을 동적되고 싶어하지만 내가 예를동적 테이블 삽입 TSQL

INSERT INTO TABLE_2011_08 
WHERE Datafields = 2011_08 

를 들어, 그냥 정적 삽입을 사용하여 매우 쉽게 할 수 알고, 그래서를 전달하는 함수/저장 프로 시저의 라인을 따라 뭔가를 생각하고 있었다 각 레코드의 날짜. 그러나 내 뇌는 이것으로 조금 녹고있다! 준비 테이블에

데이터 레코드는 다음과 같이 될 수있다 : -

RecordA 2011-08-30 Data Data Data 
RecordB 2011-08-31 Data Data Data 
RecordC 2011-09-01 Data Data Data 
RecordD 2011-09-02 Data Data Data 

답변

2

표 T는 귀하의 테이블과 유사합니다. 귀하의 테이블에 가까운 테스트 데이터로 테이블을 채웠으므로 귀하가 존재하지 않는 테이블이 생성됩니다.

시도가 필요하면 만들고 TABLE_YYYY_MM 같은 테이블을 채 웁니다 테이블

CREATE TABLE T(name varchar(10), date datetime) 

insert t values('RecordA','2011-08-30') 
insert t values('RecordB','2011-08-31') 
insert t values('RecordC','2011-09-01') 
insert t values('RecordD','2011-09-02') 

이 구문을 다시합니다. YYYY 및 MM은 어떤 조합이든지 표를 찾은 것입니다. T

Declare @tablename varchar(64) 
Declare @sql as varchar(max) 
Declare @d as datetime 
Declare dCursor CURSOR FAST_FORWARD FOR 
SELECT DISTINCT dateadd(month, datediff(m, 0, date), 0) date from t 
OPEN dCursor 
FETCH NEXT FROM dCursor 
INTO @d 
WHILE @@FETCH_STATUS = 0 
BEGIN 
SET @tablename = '[TABLE_'+replace(CONVERT(VARCHAR(7), @d, 121), '-', '_') + ']' 
SET @SQL = 
'if OBJECT_ID('''[email protected]+''', ''U'') is null 
BEGIN 
Declare @sql2 varchar(max) 
SET @sql2 = ''SELECT * INTO '[email protected]+' 
FROM t WHERE 1 = 2'' 
EXEC(@sql2) 
END 
INSERT INTO '+ @tablename+' 
SELECT * FROM t 
WHERE datediff(m, 0, date)=' + CAST(datediff(m, 0, @d) AS VARCHAR(10)) 

EXEC(@SQL) 
FETCH NEXT FROM dCursor 
INTO @d 

END 
CLOSE dCursor 
DEALLOCATE dCursor 
+0

고맙습니다. 이것은 내가 겪은 것입니다. :) –

3

난 당신이 바로, 당신이 동적으로 변화하는 테이블 이름 INSERT 문을 생성 할 이해한다면?

당신은 문자열로 SQL 쿼리를 구성하고 EXEC 그것을 실행할 수 있습니다 : 데이터 라우팅을 달성하기

DECLARE @sql nvarchar(MAX) 
SELECT @sql = N'INSERT ' + @tableName + ' VALUES (...)' 

EXEC (@sql) 

가장 쉬운 방법은 커서와 준비 데이터를 반복하고 동적 삽입 SQL 문자열을 만드는 것입니다 그 루프에서.

그런 다음 EXEC 명령 하나로 삽입 배치를 실행하십시오. 여기

+0

예, 본질적으로 내가하고 싶은 것이 있습니다. 그러나 각 레코드의 날짜 필드를 읽어야합니다. 준비 테이블에서 2011-08 및 2011-09에 대한 데이터가있을 수 있지만 적절한 데이터가 적절한 테이블로 이동되기를 원합니다. 따라서 2011-08 테이블의 데이터 만 2011-08 테이블에 저장되고 2011-09 테이블의 데이터 만 2011-09 테이블에 저장됩니다. –

+0

내 대답을 편집했습니다 : 준비 테이블 위로 커서를두고 반복하고 데이터 행당 하나의 INSERT를 만듭니다. – Jan

4

당신은 이동 :

CREATE TABLE dbo.Some_Meaningful_Descriptive_Name (
    record_id CHAR(7)  NOT NULL, 
    some_date DATETIME  NOT NULL, 
    some_data VARCHAR(20) NOT NULL, 
    ... 
) 

이제 가져 오기 프로세스는 테이블에 넣어해야합니다. 동적 요구 사항이 없으며 매달 새로운 테이블을 만들 필요가 없습니다.

경우 정말들이 다음 테이블에 뷰를 생성 분리 해 보이게해야합니다

당신이 당신이 실제로 분리에 넣어 필요가 너무 많은 행이있을 때 매우 드문 것
CREATE VIEW dbo.Some_Meaningful_Descriptive_Name_2011_08 
AS 
BEGIN 

    SELECT 
     record_id, 
     some_data 
    FROM 
     dbo.Some_Meaningful_Descriptive_Name 
    WHERE 
     some_date >= '2011-08-01 00:00:00.000' AND 
     some_date < '2011-09-01 00:00:00.000' 
END 

테이블. (우리는 수십만 개의 행을 말하고 있습니다). 이제는 파티셔닝을 할 필요가 없습니다.

별도의 테이블에 넣으면 앞으로는 더 잘 작동하지 않을 것입니다.

+0

예, 잘못된 디자인을 수정하십시오. +1 000,000 – HLGEM