2013-03-12 172 views
1

我盡了最大努力瀏覽網頁,但這個問題沒有解決。我在SSIS中有一個存儲過程,工作正常。它做了一堆最終返回一些數字和文本的東西。該過程本身使用#temp表,因爲數據不需要超出proc運行並返回〜931K行。Excel SSIS查詢在Excel中返回空列,但不在管理工作室中

下一步是將proc的輸出轉換爲excel。使用MS查詢,我調用包含必要參數的proc。它運行,但我得到的唯一數據是帶數字的列。我錯過了文本值。我認爲這可能是從SSIS到Excel的文本翻譯問題,所以我將輸出從nvarchar更改爲varchar,問題依然存在。我編寫了proc,因此我可以進行必要的更改。此外,我認爲這可能是一個臨時表問題,所以我嘗試構建一個表,使用proc將數據插入到那裏,然後將該表拉到Excel中,而當我有更多的文本列時,數字仍然是空白的。

有什麼建議嗎?

問題簡述: SQL在管理工作室中工作,但文本不返回到Excel。當完成導入/更新時,proc中的數字或行與Excel中的行數相匹配。數字如預期回來。

版本:

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

可能大家看到的程序的文本,還是與你想要做的事情接近的東西?並返回列的數據類型? – 2013-03-12 16:06:56

+0

請編輯原始文章以包含它,如果它太長,所以我們可以瞭解發生了什麼。儘管如此,我注意到,您將所有內容指定爲「varchar(max)」 - 可能是由於某些原因,MS查詢不喜歡文本的長度。 – 2013-03-12 18:16:52

+0

更新與代碼的帖子,並刪除了我的superflous評論。 – 2013-03-12 18:35:47

回答

2

此問題的解決方案歸結爲數據類型。如果您知道您的目標Excel,那麼您必須使用Excel可以轉換的數據類型。我一直在使用nvarchar(max),它沒有被帶到Excel中,當我將字段更改爲文本和字符時,我很好。一旦我知道要尋找什麼,我從Microsoft那找到了這個答案:Microsoft Excel Data Types。還有一個限制頁面:Data Type Limitations。另一部分是我正在使用存儲過程而不是純SQL,儘管直接從表中選擇也存在問題。我試圖加載一張表,而不是依靠存儲過程來進行類似的故障。沒有任何錯誤被返回,這只是沒有數據。經過我的測試,這裏的文本/字符類型轉換和他們的成功:

文本 - 工程
NTEXT - 工程
焦 - 工程
的nchar - 工程
VARCHAR - 失敗
nvarchar的 - 失敗

0

我猜的程序做了最後的選擇來自#results,並且所需的結果在SQL Server管理工作室查詢分析器中可見;但是隨後,當您在SSIS數據流中調用過程時,文本數據將消失到您的Excel目標中?

這裏有幾件事要嘗試。使用數據查看器(位於步驟之間的箭頭)來檢查您的文本列是否包含過程調用下游所需的文本。使用派生列小部件將文本置入所需的數據類型(例如,VARCHAR的代碼頁1252)。 SSIS對數據類型非常挑剔。

最後,嘗試一個不同的目標,例如一個平面文本文件,如csv文件。您可以使用派生列小部件進行連接,並在文本週圍添加逗號和雙引號標記以及任何您想嘗試的其他內容。然後,您可以在記事本中看到您是否獲得了所需的輸出,並且Excel應該能夠打開一個csv文件。

以前對Excel記錄的限制是64,000,但是我相信在Excel 2007中已經很久了。我一直將2000KB的限制剪切和粘貼輸出到記事本中(它默默地失敗,這令人沮喪,直到我記得) 。但是你的931K記錄可能會達到一些其他限制,所以嘗試更小的輸出集合,看看這些記錄是否有任何不同。

+0

如果您在ms發送excel之前返回一些值的ms查詢數據查看器,它具有與空白列相同的問題。從SSMS開始,我保存爲csv並試圖導入該文件,但確實收到了文本,雖然格式錯誤可能是因爲結果文本中有一些逗號。 – 2013-03-12 18:46:21

+0

我研究了excel單元中的最大字符數,對於2007,它是32,767個字符。我懷疑我有任何後果,即使我做了,但我應該得到那些不這樣做,除非excel只是傾倒一列,如果有一個單獨的臀部 – 2013-03-12 18:57:02

+0

好吧,我剛剛得到了一些結果,似乎它是數據類型問題。我將所有可以從nvarchar轉換爲ntext的東西都變成了結果。這是一個奇怪的問題,但至少我有一個答案。謝謝大家的貢獻。我從你們那裏得到的提示給了我我需要的方向。 – 2013-03-12 18:59:45

相關問題