2011-06-13 3 views
4

다른 실행 프로 시저의 데이터를 사용하여 테이블을 만들고, 값을 임시 테이블에 삽입하고, 이미지 열을 추가하는 다음 실행 문이 있습니다 () 그룹화에 포함 된 다음 다른 임시 테이블에서 기준 (결과 테이블 필드는 SSRS 보고서에 사용됩니다에 기반을 업데이트, 그래서) 이미지 데이터 형식을 유지해야한다 :임시 테이블에 열이 있는지 항상 확인합니다.

EXEC ('SELECT ' + @COL_TO_GROUP_BY + @COL_ADDITONAL + @sColVals + ' INTO 
#RESULTS_TABLE from (' + @SQL_STATEMENT + ') A ' + @WHERE_CLAUSE + ' GROUP BY ' + 
@COL_TO_GROUP_BY + 

' ALTER TABLE #RESULTS_TABLE 
ADD IMAGE_DATA IMAGE 

IF EXISTS(SELECT * FROM tempdb.INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 
''COLUMN_A'' and TABLE_NAME LIKE ''#RESULTS_TABLE%'') 
BEGIN 
    UPDATE #RESULTS_TABLE 
    SET IMAGE_DATA = FILE_DATA 
    FROM #RESULTS_TABLE A, #IMAGE_TABLE B 
    WHERE A.COLUMN_A = B.COLUMN_A 
END 

SELECT * FROM #RESULTS_TABLE') 

문제를 COLUMN_A의 유무에 관계없이 IMAGE_DATA의 열은 항상 NULL입니다. IMAGE_DATA 열에 데이터를 가져 오는 다른 방법이 있습니까? 도와주세요!

참고 : 아니요,은 문제가 다른 테이블의 콘텐츠, 특히 WHERE 절과 관련되어 있다고 결론을 내리는 모든 대답을 수락 할 것입니다. 조건이 true와 false (일치하는 행, 일치하는 행 등)가 될 수 있도록 여러 유효성 검사를 수행했습니다. 그래서 이것은 조건문을 배제합니다. 감사.

편집 :

나는 그것의 정확한 원인이 무엇인지 완전히 아직 확실하지 않다,하지만 난 전역 임시 테이블을 생성 결국 두 개의 별도의 절차를 실행, 지금은 잘 작동하는 것 같군. 나는 내 자신의 해결책과 가장 근접한 대답을 받아 들여야 만했다. 모든 답변과 의견은 매우 실용적이었습니다. 감사!

+0

우선,'WHERE A.COLUMN_A = B.IMAGE_VALUE' 조건을 생략하려고합니다. 그것은 나를 위해 소리가납니다. 그것은'OBJ_ID'에 의해 올바른 행을 찾는데 충분합니다. –

+0

그 점을 지적 해 주셔서 감사합니다. 내 경우에는 OBJ_ID가 중복 된 행이 있기 때문에 두 조건이 모두 필요합니다. 오리지널 코드를 간략화 했으므로 오해의 소지가 있으므로이 코드를 가져와야합니다. 나는 그 질문을 편집 할 것이다. –

+0

이것이 도움이되는지 잘 모르겠지만, 상수이므로 group by 절에 추가하지 않고이 'cast (image as null) as IMAGE_DATA'와 같은 select 문에 이미지 열을 추가 할 수 있다고 생각합니다. 왜 열이 존재하는지 테스트해야하는 이유는 무엇입니까? –

답변

2

수정.

편집 할 때 열이 없습니다. 즉, SQL Server는 전체 명령 집합을보고 구문 분석/컴파일합니다. 코드에서 ALTER TABLE의 효과는 나중 명령에서 볼 수 없습니다. 일부 복잡성을 훨씬 더 유연 VARBINARY (최대)가 제거 것 SQL Server 2005의 경우

+0

답장을 보내 주셔서 감사합니다. 나는 SQL Server 2008을 사용하고 있습니다. 이미지 열을 varbinary (최대)로 변환하고 varbinary (다른 제안에 따라)에서 varbinary로 변환하려고 시도했지만 그다지 횡설수 절하므로 옵션이 아닙니다. 내가 ALTER TABLE을 UPDATE와 별도로 어떻게해야하는지 명확하게 설명해 주시겠습니까? 두 개의 EXEC 문을 수행하면 임시 테이블의 범위를 벗어납니다. 감사. –

3

당신은 몇 가지 문제가 있습니다

당신은

참고 UPDATE에 별도로 ALTER 표를해야 스크립트에서 :

  • TempDBtempdb의 올바른 이름이 아닙니다. 대소 문자를 구분하여 설치 한 서버에서 코드가 손상됩니다. 항상 모든 데이터베이스 이름에 대/소문자를 사용하십시오. 대/소문자를 구분하는 배포에서 실행되는 경우 코드는 COLUMN_A과 같이 결과 열 이름에서 비슷하게 손상 될 수 있습니다.
  • 동시성에서 논리가 올바르지 않습니다. 세션 A는 세션 B의 #temp 테이블을보고 잘못된 동작을 수행합니다.

:

  • 간단한 테스트는 열 볼을 것을 보여준다.

    EXEC ('SELECT * INTO #RESULTS_TABLE from 
        (select *, newid() as COLUMN_A from master..spt_values) A; 
    ALTER TABLE #RESULTS_TABLE 
    ADD IMAGE_DATA varbinary(max); 
    IF EXISTS(SELECT * FROM TempDB.INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 
    ''COLUMN_A'' and TABLE_NAME LIKE ''#RESULTS_TABLE%'') 
    BEGIN 
        update #RESULTS_TABLE 
         set IMAGE_DATA = 0xBAADF00D; 
    END 
    SELECT * FROM #RESULTS_TABLE') 
    

    이 테스트는 열 가 업데이트되었다는 표시되므로 검사에 대한 성공이 존재한다. 분명한 결론은 귀하의 경우 OBJ_ID #RESULTS_TABLE과 #IMAGE_TABLE 사이에 조인이 일치하지 않는 것으로 나타났습니다. 이는 전적으로 테이블의 내용에 따라 달라지는 문제입니다.

    편집 테스트 할 때

    당신은 동적하기 위해 COLUMN_A을 만들 수 있습니다, 그것은 여전히 ​​잘 작동 :

    declare @cn sysname = case 
         when RAND() * 100 >= 50 then 'COLUMN_A' 
         else 'COLUMN_B' end; 
    
    EXEC (N'SELECT * INTO #RESULTS_TABLE from (
        select *, newid() as ' + @cn + N' from master..spt_values) A; 
    ... 
    
  • +0

    답변 해 주셔서 감사합니다. 질문 편집을 참조하십시오. 이 포럼을 사용하여 내 첫 질문이므로 맨 처음 만났을 때 질문을 분명히해야했습니다. 나는 당신이 당신의 시험에 사용했던 절차를 시도 할 것입니다. –

    +0

    불쾌감은 없지만 '귀하의 단어 대 테스트를 거친 행동'에 직면 할 때마다 나는 '테스트 된 행동'을 선택합니다. 공이 당신 법원에 있다면, IF 지점이 취해지지 않았 음을 증명해야합니다. –

    +0

    나는 당신의 스크립트를 보았고 당신이 그것을 실행 한 방식과 내가 가진 방식에 차이가 있다는 것을 깨달았습니다. 내 스크립트에서 명시 적으로 COLUMN_A을 (를) 작성하지 않았습니다. COLUMN_A는 다른 프로 시저 (다른 테이블)에서 가져온 내용에 따라 나타나므로 동적입니다. 네가 맞다. 내가 이렇게하면 잘 작동한다. (그리고이 경우에는 체크를하지 않아도된다.) 문제는 동적으로 생성 된 열로 생각됩니다. –

    3

    열을 사용하여 임시 테이블에 존재하는지 확인할 수 있습니다 ..

    IF EXISTS (SELECT * FROM TempDB.INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'Column' AND TABLE_NAME LIKE '#TempTable%') 
        PRINT 'Column exists' 
    ELSE 
        PRINT 'Column doesn''t exists' 
    
    관련 문제