2013-03-12 2 views
1

웹을 둘러 보려고 최선을 다했지만이 문제는 저를 피합니다. SSIS에 잘 작동하는 저장 프로 시저가 있습니다. 결국 몇 개의 숫자와 텍스트를 돌려주는 일련의 작업을 수행합니다. 프로 시저 자체는 #temp 테이블을 사용합니다. 데이터가 프로 시저 실행 이상으로 존재할 필요가 없으므로 ~ 931K 행을 반환합니다.Excel SSIS 쿼리는 Excel에서 null 열을 반환하지만 관리 Studio에서는 반환하지 않습니다.

다음 단계는 proc의 출력을 Excel로 가져 오는 것입니다. MS 쿼리를 사용하여 필자는 필요한 매개 변수를 포함하여 proc를 호출합니다. 그것은 실행되지만 데이터를 얻은 유일한 데이터는 숫자가있는 열입니다. 텍스트 값이 누락되었습니다. 나는 그것이 SSIS에서 Excel 로의 텍스트 번역 문제일지도 모른다고 생각하여 출력을 nvarchar에서 varchar로 변경하고 문제가 남아 있습니다. 나는 필요한 모든 변경을 할 수 있도록 proc을 작성했다. 또한 임시 테이블 문제 일 수도 있으므로 테이블을 구축하고 proc을 사용하여 데이터를 삽입 한 다음 해당 테이블을 Excel로 가져 와서 몇 개의 텍스트 열이있는 동안 숫자가 여전히 비어 있다고 생각했습니다.

제안 사항이 있습니까?

짧은 버전의 문제 : SQL은 관리 스튜디오에서 작동하지만 SQL은 Excel로 반환되지 않습니다. Excel에서 가져 오기/업데이트가 완료되면 proc의 행 수가 Excel의 행 수와 일치합니다. 숫자가 예상대로 돌아옵니다.

버전 :

엑셀 2007 - SQL 서버 2005 - 관리 스튜디오 : 2008R2 - ODBC 연결 MS 쿼리 사용 -

USE [cmdb] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER proc [estimate].[sp_calendar]( 
    @calendar_start char(8), 
    @years as int 
    ) 
as 

set nocount on; 

declare @calendar_end char(8) 
declare @actual_start_date datetime 
declare @actual_end_date datetime 
declare @loop_counter datetime 

set @actual_start_date = CONVERT (datetime, @calendar_start, 112) 
set @loop_counter = @actual_start_date 
set @actual_end_date = dateadd(year,[email protected],@actual_start_date) 
set @calendar_end = cast(year(@actual_end_date) as char(4))+RIGHT('00'+ CONVERT(VARCHAR,month(@actual_end_date)),2)+RIGHT('00'+ CONVERT(VARCHAR,day(@actual_end_date)),2) 

begin 
create table #calendar (
    [yearmonth] nvarchar(8) 
) 
end 

begin 
    create table #results (
     [actual ExpectedActionDt] datetime 
     ,[calc ExpectedActionDt] ntext 
     ,ExpectedActionDt datetime 
     ,[calc IntegratedReleasePlanDt] ntext 
     ,IntegratedReleasePlanDt datetime 
     ,[key] ntext 
     ,projectid ntext 
     ,projectnm ntext 
     ,ParentChaseProjectNo ntext 
     ,VersionTag ntext 
     ,itemid ntext 
     ,Qty float 
     ,ItemNotes ntext 
     ,CashflowType ntext 
     ,frequency ntext 
     ,UnitPrice float 
     ,[cost] float 
     ) 
end 

begin 
    create table #baseline (
    [actual ExpectedActionDt] datetime 
    ,[calc ExpectedActionDt] nvarchar(8) 
    ,ExpectedActionDt datetime 
    ,[calc IntegratedReleasePlanDt] nvarchar(8) 
    ,IntegratedReleasePlanDt datetime 
    ,[key] ntext 
    ,projectid ntext 
    ,projectnm ntext 
    ,ParentChaseProjectNo ntext 
    ,VersionTag ntext 
    ,itemid ntext 
    ,Qty float 
    ,ItemNotes ntext 
    ,CashflowType ntext 
    ,frequency ntext 
    ,UnitPrice float 
    ,[cost] float) 
end 

insert into #calendar (
     [yearmonth]) 
     select 
     distinct calendarid [yearmonth] 
    from 
     [cmdb_core].[dbo].[Calendar] 
    where 
     calendarid between @calendar_start and @calendar_end 

    insert into #baseline (
     [actual ExpectedActionDt] 
     ,[calc ExpectedActionDt] 
     ,ExpectedActionDt 
     ,[calc IntegratedReleasePlanDt] 
     ,IntegratedReleasePlanDt 
     ,[key] 
     ,projectid 
     ,projectnm 
     ,ParentChaseProjectNo 
     ,VersionTag 
     ,itemid 
     ,Qty 
     ,ItemNotes 
     ,CashflowType 
     ,frequency 
     ,UnitPrice 
     ,[cost])   
    select 
     case 
      when (ExpectedActionDt is not null) 
       then ExpectedActionDt 
      when (IntegratedReleasePlanDt is not null) 
       then IntegratedReleasePlanDt 
      else 
       DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0) 
     end [actual ExpectedActionDt] 
     ,case 
      when (ExpectedActionDt is not null) 
       then cast(year(ExpectedActionDt) as char(4))+RIGHT('00000'+ CONVERT(VARCHAR,month(ExpectedActionDt)),2)+RIGHT('00'+ CONVERT(VARCHAR,day(ExpectedActionDt)),2) 
      when (IntegratedReleasePlanDt is not null) 
       then cast(year(IntegratedReleasePlanDt) as char(4))+RIGHT('00000'+ CONVERT(VARCHAR,month(IntegratedReleasePlanDt)),2)+RIGHT('00'+ CONVERT(VARCHAR,day(IntegratedReleasePlanDt)),2) 
      else 
       cast(year(getdate()) as char(4))+'0101' 
     end [calc ExpectedActionDt] 
     ,ExpectedActionDt 
     ,cast(year(IntegratedReleasePlanDt) as char(4))+RIGHT('00'+ CONVERT(VARCHAR,month(IntegratedReleasePlanDt)),2)+RIGHT('00'+ CONVERT(VARCHAR,day(IntegratedReleasePlanDt)),2) [calc IntegratedReleasePlanDt] 
     ,IntegratedReleasePlanDt 
     ,cast(ModelEstimateId as nvarchar(max))+cast(BucketId as nvarchar(max))+cast(ItemNo as nvarchar(max)) [key] 
     ,projectid 
     ,projectnm 
     ,ParentChaseProjectNo 
     ,VersionTag 
     ,itemid 
     ,Qty 
     ,ItemNotes 
     ,CashflowType 
     ,frequency 
     ,UnitPrice 
     ,case 
      when frequency = 'OneTime' 
       then Qty 
      else 
       cast(round((UnitPrice*Qty)/12,0) as int) 
      end [cost] 
    from 
     estimate.ComputedEstimates 
    where 
     [status] <> 'Hold' 
     and CostCategory <> 'Assembly' 
     and includeinforecast = 'Y' 
     and case 
      when (ExpectedActionDt is not null) 
       then cast(year(ExpectedActionDt) as char(4))+RIGHT('00000'+ CONVERT(VARCHAR,month(ExpectedActionDt)),2)+RIGHT('00'+ CONVERT(VARCHAR,day(ExpectedActionDt)),2) 
      when (IntegratedReleasePlanDt is not null) 
       then cast(year(IntegratedReleasePlanDt) as char(4))+RIGHT('00000'+ CONVERT(VARCHAR,month(IntegratedReleasePlanDt)),2)+RIGHT('00'+ CONVERT(VARCHAR,day(IntegratedReleasePlanDt)),2) 
      else 
       cast(year(getdate()) as char(4))+'0101' 
      end >= @calendar_start 


WHILE (@loop_counter <= @actual_end_date) 
BEGIN 
insert into #results (
     [actual ExpectedActionDt] 
     ,[calc ExpectedActionDt] 
     ,ExpectedActionDt 
     ,[calc IntegratedReleasePlanDt] 
     ,IntegratedReleasePlanDt 
     ,[key] 
     ,projectid 
     ,projectnm 
     ,ParentChaseProjectNo 
     ,VersionTag 
     ,itemid 
     ,Qty 
     ,ItemNotes 
     ,CashflowType 
     ,frequency 
     ,UnitPrice 
     ,[cost]) 
select * from #baseline where [actual ExpectedActionDt] >= @loop_counter 

set @loop_counter = dateadd(day,+1,@loop_counter) 
END 


select 
    c.[yearmonth] 
    ,a.[calc ExpectedActionDt] 
    ,a.[key] 
    ,a.projectid 
    ,a.projectnm 
    ,a.ParentChaseProjectNo 
    ,a.VersionTag 
    ,a.itemid 
    ,a.ItemNotes 
    ,a.CashflowType 
    ,a.frequency 
    ,a.Qty 
    ,a.UnitPrice 
    ,a.[cost] 
from 
    #calendar as c 
    left outer join 
    #results a 
    on c.[yearmonth] = a.[calc ExpectedActionDt] 
order by 1,2,3 

drop table #baseline 
drop table #results 
drop table #calendar 
+0

우리가 볼 수 실패 프로 시저의 텍스트 또는 수행하려는 작업과 유사한 작업을 수행합니까? 반환되는 열의 데이터 유형은 무엇입니까? –

+0

원본 게시물을 편집하여 너무 길면 내용을 포함 시켜서 무슨 일이 일어나는지 알 수 있습니다. 말하지만, 모든 것을 varchar (max)로 지정하고 있음을 알 수 있습니다. MS 쿼리가 어떤 이유로 텍스트의 길이를 좋아하지 않을 수도 있습니다. –

+0

코드로 게시물을 업데이트하고 나에 의해 superflous 코멘트를 삭제했습니다. –

답변

2

이 문제에 대한 해결책은 데이터 유형에 달려 있습니다. 내가했던 것처럼 대상 Excel을 알고 있다면 Excel에서 변환 할 수있는 데이터 형식을 사용해야합니다. Excel로 가져 오지 않은 nvarchar (max)를 사용하고있었습니다. 필드를 텍스트와 char로 변경했을 때, 좋았습니다. 내가 무엇을 찾을 지 알았 더라면 나는이 대답을 마이크로 소프트로부터 찾아 냈다 : Microsoft Excel Data Types. 한계에 대한 페이지도있었습니다 : Data Type Limitations. 다른 부분은 테이블에서 직접 선택하는 데 문제가 있었지만 순수한 SQL보다는 저장 프로 시저를 사용하고 있다는 것이 었습니다. 비슷한 방법으로 저장 프로 시저를 사용하는 대신 표를로드하려고했습니다. 이 중 어떤 것에도 오류가 반환되지 않았으므로 데이터가 없습니다.내 테스트를 통해, 여기에 텍스트/문자 형식 변환 및 성공 있습니다 : -
NTEXT 작동 -

텍스트가
문자를 작동 -
NCHAR를 작동 -
VARCHAR를 작동 -
NVARCHAR 실패 -

0

나는 과정을 추측하고있어이 선택한 최종 않습니다 #results에서 원하는 결과가 SQL Server 관리 Studio 쿼리 분석기에 표시됩니다. 그런 다음 SSIS 데이터 흐름에서 프로 시저를 호출하면 Excel 데이터에 텍스트 데이터가 사라집니다.

다음은 몇 가지 시도입니다. 단계 사이의 화살표에있는 데이터 뷰어를 사용하여 텍스트 열에 프로 시저 호출의 다운 스트림 인 원하는 텍스트가 들어 있는지 확인하십시오. 파생 된 열 위젯을 사용하여 텍스트를 원하는 데이터 유형 (예 : VARCHAR의 경우 코드 페이지 1252)에 넣으십시오. SSIS는 데이터 유형에 신경 쓰입니다.

마지막으로 다른 대상 (예 : csv 파일과 같은 일반 텍스트 파일)을 시도해보십시오. 파생 된 열 위젯을 사용하여 연결을 수행하고 쉼표 및 큰 따옴표를 텍스트 주위에 추가 할 수 있습니다. 그런 다음 원하는 출력을 얻었는지 메모장에서 볼 수 있으며 Excel에서 CSV 파일을 열 수 있어야합니다.

Excel 레코드에는 64,000 개의 제한이 있었지만 Excel 2007에서는 오래전부터 사용하지 못했습니다. 필자는 2000KB 제한을 메모장에 잘라내어 붙여 넣기를 계속하고 있습니다. (나는 기억할 때까지 자동으로 실패합니다.) . 그러나 931K 레코드가 다른 한계를 치고있을 수 있으므로 더 작은 출력 세트를 시도해보고 이들이 다른 방식으로 작동하는지 확인하십시오.

+0

Excel로 전송하기 전에 일부 값을 반환하는 ms 쿼리 데이터 뷰어의 경우 빈 열과 동일한 문제가 있습니다. SSMS에서 CSV로 저장하고 가져 오려고했는데 결과 텍스트에 쉼표가 있기 때문에 형식이 잘못되었지만 텍스트를 가져 왔습니다. –

+0

Excel 셀에서 최대 문자 수를 조사한 결과 2007 년에는 32,767 자입니다. 나는 골짜기가있는 어떤 결과가 있는지 의심 스럽다. 비록 내가했을지라도, 단 하나 골짜기가 있다면 그냥 뛰어 넘지 않는 한 얻지 말아야한다. –

+0

좋아, 나는 결과가 약간있는 것 같다. 데이터 유형 문제. 내가 할 수있는 모든 것을 nvarchar에서 ntext로 바꿨고 결과가 나왔다. 이것은 이상한 문제이지만, 적어도 나는 대답을 가지고있다. 당신의 공헌에 감사드립니다. 내가 너희에게 보낸 지시는 내가 필요한 방향을 내게 주었다. –