したがって、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つの興味深いことがあります。
ローカルのSQL2012インストールにデプロイしましたが、正常に機能し、同じ接続などでした。したがって、サーバー/データベース構成である可能性があります。それが何であるかわからない、私は開発サーバーをインストールしなかった、そして私自身のインストールはほとんどバニラをクリックしていた。
- おそらく最も興味深いことです。プロシージャのステートメントから結合を削除すると、次のようになります。
DimensionTableからDimensionID、DimensionFieldを選択します
結果セットで2列を送信するだけに戻ります。したがって、出力列を追加せずに結合を追加すると、結果セットが3列になります。さらに6つの結合を追加しても、3つの列だけです。したがって、1つの推測は、結合がある場合にのみアクティブ化されるある種のメタデータ列です。
とにかく、あなたが想像できるように、それは私を一種の狂気に駆り立てています。データを一時テーブルにロードしてそれを返す回避策がありますが、なぜこれが機能しないのですか?どのような追加の列が返送されていますか?なぜ私が参加を追加するときだけですか?
ああ!