1

私はウェブを見回すために最善を尽くしましたが、この問題は私にはわかりません。正常に動作するストアドプロシージャがSSISにあります。それは最終的にいくつかの数字とテキストを返すたくさんのことをします。データはprocrunを超えて存在する必要がなく、最大931K行を返すため、プロシージャ自体は#tempテーブルを使用します。

次のステップは、procの出力をExcelにすることでした。MSクエリを使用して、必要なパラメータを含めてprocを呼び出します。実行されますが、返されるデータは数値のある列だけです。テキスト値がありません。SSISからExcelへのテキスト変換の問題である可能性があると考えたため、出力をnvarcharからvarcharに変更しましたが、問題は解決していません。必要な変更を加えることができるように、procを作成しました。また、一時テーブルの問題かもしれないと思ったので、テーブルを作成し、procを使用してそこにデータを挿入し、そのテーブルをExcelにプルしてみましたが、テキスト列がさらにいくつかありましたが、数値はまだ空白でした。

何か提案はありますか?

問題の短いバージョン:SQLはManagement Studioで機能しますが、テキストがExcelに返されません。procからの1つまたは複数の行は、インポート/更新が終了したときのExcelの行数と一致します。数字は期待通りに戻ってきます。

バージョン:

Excel:2007-SQL Server:2005-管理スタジオ:2008R2-MSクエリを使用したODBC接続-

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,+@years,@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
4

2 に答える 2

2

この問題の解決策は、データ型に帰着しました。私が行ったように、宛先のExcelがわかっている場合は、Excelが変換できるデータ型を使用する必要があります。Excelに持ち込まれていないnvarchar(max)を使っていたのですが、フィールドをtextとcharに変えたら良かったです。何を探すべきかがわかったら、Microsoftからこの回答を見つけました:MicrosoftExcelデータ型。制限に関するページもありました:データ型の制限。もう1つは、テーブルから直接選択することにも問題がありましたが、純粋なSQLではなくストアドプロシージャを使用していたことです。同様の失敗でストアドプロシージャに依存するのではなく、テーブルをロードしようとしました。これらのいずれにもエラーは返されませんでした。データがないだけでした。私のテストを通して、テキスト/文字タイプの変換とその成功は次のとおりです。

text-works
ntext-works
char-works
nchar-works
varchar-failed
nvarchar-failed

于 2013-03-13T12:36:42.713 に答える
0

手順は#resultsから最終選択を行い、目的の結果はSQL ServerManagementStudioクエリアナライザーに表示されると思います。しかし、SSISデータフローでプロシージャを呼び出すと、テキストデータがExcelの宛先に入る途中で消えますか?

試すべきことがいくつかあります。データビューア(ステップ間の矢印上にあります)を使用して、プロシージャ呼び出しの下流で、テキスト列に目的のテキストが含まれていることを確認します。派生列ウィジェットを使用して、テキストを目的のデータ型に配置します(たとえば、VARCHARのコードページ1252)。SSISはデータ型について気難しいです。

最後に、別の宛先、たとえばcsvファイルなどのフラットテキストファイルを試してください。派生列ウィジェットを使用して、連結を実行し、テキストやその他の試行したいものの周りにコンマと二重引用符を追加できます。次に、メモ帳で目的の出力が得られているかどうかを確認できます。Excelでcsvファイルを開くことができるはずです。

以前はExcelレコードに64,000の制限がありましたが、Excel 2007ではそれがずっとなくなったと思います。出力をメモ帳に切り取って貼り付ける2000KBの制限に達し続けています(覚えているまで、静かに失敗し、イライラします)。ただし、931Kレコードが他の制限に達している可能性があるため、より小さな出力セットを試して、それらが異なる動作をするかどうかを確認してください。

于 2013-03-12T18:12:46.503 に答える