2016-07-06 9 views
1

나는 방금 Sams Teach Yourself SQL in 10 Minutes을 읽는 것을 끝냈다는 점에서 SQL에 매우 익숙하다. 이것이 유일한 SQL 지식이다. 이제 내가이 책을 다 마쳤으니 몇 개의 테이블을 만들어서 그들과 놀 수 있습니다. 알려진 양의 컬럼과 지정된 헤더로 테이블을 쉽게 만들 수 있습니다. 문제가있는 곳은 알 수없는 양의 열과 날짜를 헤더로 사용하여 테이블을 만드는 것입니다. 내가 여기서 뭘하려고 무엇루프에서 변수를 사용하여 열을 만들거나 추가하는 방법

DECLARE @start_date AS DATE 
DECLARE @end_date AS DATE 
DECLARE @curr_date AS DATE 
DECLARE @column_name AS CHAR(10) 

SET @start_date = 2016-01-02 
SET @end_date = 2016-12-31 
SET @curr_date = @start_date 

WHILE @curr_date < @end_date 
    SET @curr_date = DATEADD(DD, 7, @curr_date) 
    ALTER TABLE Project_1 
     ADD @curr_date DOUBLE 

루프의 시작과 끝 지점을하고 그 이후 내 열 머리글로 지역 변수에 저장되어있는 루프 조건을 사용하는 것입니다 : 내가 지금까지 시도하는 것은 이것이다 나는 열 제목이 필요합니다. 나는 또한 CAST을 char로 형변환하려고 시도했지만 DBMS는 그 마지막 줄 (ADD 줄)에 Incorrect syntax near '@curr_date'이 있음을 알리게되어 기쁘게 생각한다. 왜냐하면 그 칼럼에 이름을 짓는 것을 좋아하지 않기 때문이다. 지역 변수 (나는 생각한다). 샘플 출력이 없지만 출력은 CHAR로 정의 된 첫 번째 열이있는 표 여야하고 emp_name이라는 제목이 붙습니다. 이름을 보유 할 것이기 때문입니다. 다른 모든 열은 유형이 DOUBLE으로 정의되어 있고 숫자는 NULL이어야하며 숫자는 몇 시간이고 현재 날짜는 헤더로 @curr_date이어야합니다. 나는 ALTER 메서드를 통해 테이블에 추가 된 모든 열이 기본적으로 NULL이 기본값이라고 생각합니다. select 문을 보유 할 변수를 선언하는 동적 SQL 예제를 보았지만 테이블에 열을 추가하는 방법을 실제로 이해하지 못합니다. 나는 이것이 CREATE 진술에서 행해질 수 있는지 확실하지 않지만 그것이 볼 수 있다면 좋을지 모른다. 또한,이 그들은 2046

보안 I 행을 사용하는 방법에 대한 의견 모두에 동의하지 않은 여기에 문제

+0

일반적으로 스키마 사용자는 일반적으로 고정 된 테이블 정의를 선호하므로 (동적 테이블이 아닌) 날짜 범위에 따라 다양한 수의 열이 있음). 그러나 SQL 문자열 ('declare @sql varchar (2000)')을 생성하고, 그것을 alter 문으로 채운 다음,'EXEC' 또는'sp_executesql'을 사용하여 실행할 수 있습니다. – Igor

+0

"header"란 무엇을 의미합니까? 컬럼 이름입니까? 열 이름으로 날짜를 사용하고 싶지는 않습니다. 그것이 고통 스러울뿐만 아니라 매우 열악한 설계의 징후 일뿐 아니라 함께 작동합니다. 또한 오늘과 2046 사이에 매일 열이 있어야하는 열의 수를 고려하십시오. 최대 열 수를 몇 자릿수만큼 초과 할 수 있습니다. –

+0

더 나은 디자인을 만드는 방법을 보여줄 수 있도록 유스 케이스를 제공해주세요. – Hogan

답변

1

이다 해 ... 나는 @end_date가 있습니다 말을 바꿀 수 있다는 사실에 변수가 될 필요가있다 동적으로 열을 추가하지 않고 항상 동적으로 피벗 할 수 있으며 더 유연하게 추가 할 수 있습니다. 어쩌면 스키마에 대한 고려 사항이 있지만 가까운 질문에 대답하는 것일 수도 있습니다.

DECLARE @start_date AS DATE 
DECLARE @end_date AS DATE 
DECLARE @curr_date AS DATE 
DECLARE @column_name AS CHAR(10) 

SET @start_date = '2016-01-02' 
SET @end_date = '2016-12-31' 
SET @curr_date = @start_date 

WHILE @curr_date < @end_date 
BEGIN 
    DECLARE @SQL NVARCHAR(MAX) 

    SET @curr_date = DATEADD(DD, 7, @curr_date) 

    SET @SQL = 'ALTER TABLE TableB 
     ADD [' + CAST(@curr_date AS VARCHAR(10)) + '] FLOAT' 

    --PRINT @SQL 
    EXECUTE (@SQL) 
END