1

したがって、SQLServerにストアドプロシージャがあります。私はそのコードを(この質問のために)これだけに単純化しました:

CREATE PROCEDURE dbo.DimensionLookup as
BEGIN
select DimensionID, DimensionField from DimensionTable
inner join Reference on Reference.ID = DimensionTable.ReferenceID
END

SQL Server 2012のSSISには、次のソースコマンドを含むルックアップコンポーネントがあります。

EXECUTE dbo.DimensionLookup WITH RESULT SETS (
(DimensionID int,  DimensionField nvarchar(700) )
)

この手順をBIDSのプレビューモードで実行すると、2つの列が正しく返されます。パッケージをBIDSで実行すると、正しく実行されます。

しかし、それをSSISカタログ(データベースが存在するのと同じサーバー)にデプロイするときは、同じデータソースなどをポイントします。次のメッセージで失敗します。

そのWITHRESULTSETS句が結果セット番号1に2列を指定したため、EXECUTEステートメントは失敗しましたが、ステートメントは実行時に3列を送信しました。

これまでに試した手順:

結果セットに3番目の列を追加すると(別のエラーVS_NEEDSNEWMETADATAが表示されます)、これは理にかなっています。3番目の列がないことを証明するものです。

SQLプロファイラー-私はこれを見ます:

exec sp_prepare @p1 output,NULL,N'EXECUTE dbo.DimensionLookup WITH RESULT SETS ((
DimensionID int,  DimensionField nvarchar(700)))',1
SET FMTONLY ON exec sp_execute 1 SET FMTONLY OFF

したがって、FMTONLYを使用して結果セットデータを取得しようとしています...言うまでもなく、SET FMTONLY ONを実行してから、SSMSでコマンドを実行すると、2つの列だけが生成されます。

NOTCOUNTONに設定-何も変更されていません。

したがって、他に2つの興味深いことがあります。

  1. ローカルのSQL2012インストールにデプロイしましたが、正常に機能し、同じ接続などでした。したがって、サーバー/データベース構成である可能性があります。それが何であるかわからない、私は開発サーバーをインストールしなかった、そして私自身のインストールはほとんどバニラをクリックしていた。

    1. おそらく最も興味深いことです。プロシージャのステートメントから結合を削除すると、次のようになります。

    DimensionTableからDimensionID、DimensionFieldを選択します

結果セットで2列を送信するだけに戻ります。したがって、出力列を追加せずに結合を追加すると、結果セットが3列になります。さらに6つの結合を追加しても、3つの列だけです。したがって、1つの推測は、結合がある場合にのみアクティブ化されるある種のメタデータ列です。

とにかく、あなたが想像できるように、それは私を一種の狂気に駆り立てています。データを一時テーブルにロードしてそれを返す回避策がありますが、なぜこれが機能しないのですか?どのような追加の列が返送されていますか?なぜ私が参加を追加するときだけですか?

ああ!

4

2 に答える 2

3

したがって、billinkcのすべての功績:理由はパッチによるものです。

バージョン11.0.2100.60では、SSISルックアップSQLコマンドのメタデータは、古いSETFMTONLYメソッドを使用して収集されます。残念ながら、 SETFMTONLYのBooksOnlineエントリが役立つように、これは2012年には機能しません。

この機能は使用しないでください。この機能はsp_describe_first_result_setに置き換えられました。

残念ながら、彼らは彼ら自身のアドバイスに従わなかったのです!

これは、バージョン11.0.2218.0からパッチが適用されています。メタデータは、sp_describe_first_result_setシステムストアドプロシージャを使用して正しく収集されます。

于 2013-01-16T22:32:56.440 に答える
0

これは、SSISで指定されたWITH結果セットが、呼び出されているストアード・プロシージャーによって返されるよりも多くの列があることを識別した場合に発生する可能性があります。ストアドプロシージャをチェックし、WITH結果セットとして正しい数の出力列があることを確認してください。

于 2021-03-10T15:52:10.320 に答える