T-SQLコマンドを使用して一時データベースとテーブルを作成する制御フローがあります。データフローを追加するとき、テーブルをクエリしたいのですが、情報を取得するためのテーブルが存在しないためできません。データベースを(まだ)存在しないため、ログインしようとするとエラーが発生します。遅延検証をtrueにしています。
データベースとテーブルを手動で作成し、クエリを使用してデータフローを追加し、データベースをドロップすると、それは固執しますが、きれいな解決策ではないようです。
一時的なステージングデータベースを作成し、データフローでクエリするより良い方法がある場合はお知らせください。
_Connection Manager
_のプロパティRetainSameConnection
をTrue
ある制御フロータスクで作成された一時テーブルを別のタスクで保持できるようにします。
_SSIS 2008 R2
_で記述されたサンプルSSISパッケージは、一時テーブルの使用を示しています。
_##tmpStateProvince
_という名前の一時テーブルを作成し、いくつかのレコードを取り込むストアドプロシージャを作成します。サンプルSSISパッケージは、最初にストアドプロシージャを呼び出し、次に一時テーブルデータをフェッチして、レコードを別のデータベーステーブルに取り込みます。サンプルパッケージはSora
という名前のデータベースを使用します。以下のストアドプロシージャ作成スクリプトを使用します。
_USE Sora;
GO
CREATE PROCEDURE dbo.PopulateTempTable
AS
BEGIN
SET NOCOUNT ON;
IF OBJECT_ID('TempDB..##tmpStateProvince') IS NOT NULL
DROP TABLE ##tmpStateProvince;
CREATE TABLE ##tmpStateProvince
(
CountryCode nvarchar(3) NOT NULL
, StateCode nvarchar(3) NOT NULL
, Name nvarchar(30) NOT NULL
);
INSERT INTO ##tmpStateProvince
(CountryCode, StateCode, Name)
VALUES
('CA', 'AB', 'Alberta'),
('US', 'CA', 'California'),
('DE', 'HH', 'Hamburg'),
('FR', '86', 'Vienne'),
('AU', 'SA', 'South Australia'),
('VI', 'VI', 'Virgin Islands');
END
GO
_
_dbo.StateProvince
_という名前のテーブルを作成します。このテーブルは、一時テーブルからレコードを取り込むための宛先テーブルとして使用されます。以下のテーブル作成スクリプトを使用して、宛先テーブルを作成します。
_USE Sora;
GO
CREATE TABLE dbo.StateProvince
(
StateProvinceID int IDENTITY(1,1) NOT NULL
, CountryCode nvarchar(3) NOT NULL
, StateCode nvarchar(3) NOT NULL
, Name nvarchar(30) NOT NULL
CONSTRAINT [PK_StateProvinceID] PRIMARY KEY CLUSTERED
([StateProvinceID] ASC)
) ON [PRIMARY];
GO
_
Business Intelligence Development Studio (BIDS)
を使用してSSISパッケージを作成します。パッケージの下部にある[接続マネージャー]タブを右クリックし、_New OLE DB Connection...
_をクリックして、アクセスする新しい接続を作成しますSQL Server 2008 R2データベース。
_New...
_ on Configure OLE DB Connection Manager]をクリックします。
Connection Managerダイアログで次のアクションを実行します。
Native OLE DB\SQL Server Native Client 10.0
_ from Providerを選択しますMACHINENAME\INSTANCE
_のようなサーバー名を入力しますUse Windows Authentication
_を選択します。Select or enter a database name
_からデータベースを選択します。サンプルはデータベース名Sora
を使用します。Test Connection
_をクリックしますOK
をクリックします。OK
on 接続マネージャをクリックします新しく作成されたデータ接続がConfigure OLE DB Connection Managerに表示されます。OK
をクリックします。
OLE DB接続マネージャー_KIWI\SQLSERVER2008R2.Sora
_は、パッケージの下部にある接続マネージャータブの下に表示されます。接続マネージャーを右クリックし、Properties
をクリックします
接続のプロパティRetainSameConnection
を設定します_KIWI\SQLSERVER2008R2.Sora
_を値True
。
パッケージ内の任意の場所を右クリックし、[Variables
]をクリックして変数ペインを表示します。以下の変数を作成します。
PopulateTempTable
という名前のデータ型の新しい変数String
パッケージスコープ_SO_5631010
_変数に値_EXEC dbo.PopulateTempTable
_を設定します。
FetchTempData
という名前のデータ型の新しい変数String
パッケージスコープ_SO_5631010
_変数を値_SELECT CountryCode, StateCode, Name FROM ##tmpStateProvince
_で設定します
_Execute SQL Task
_をControl Flowタブにドラッグアンドドロップします。 SQL実行タスクをダブルクリックして、SQLタスク実行エディターを表示します。
SQLタスクエディタの実行のGeneral
ページで、次のアクションを実行します。
Create and populate temp table
_に設定しますOLE DB
_に設定しますKIWI\SQLSERVER2008R2.Sora
_に設定しますVariable
からSQLSourceTypeを選択しますUser::PopulateTempTable
_ from SourceVariableを選択しますOK
をクリックします_Data Flow Task
_をControl Flowタブにドラッグアンドドロップします。データフロータスクの名前を_Transfer temp data to database table
_に変更します。 SQLタスクの実行から緑の矢印をデータフロータスクに接続します。
_Data Flow Task
_をダブルクリックして、データフロータブに切り替えます。 _OLE DB Source
_をData Flowタブにドラッグアンドドロップします。 OLE DB Sourceをダブルクリックして、OLE DB Source Editorを表示します。
OLE DB Source Editorの_Connection Manager
_ページで、次のアクションを実行します。
KIWI\SQLSERVER2008R2.Sora
_ from OLE DB Connection Managerを選択しますSQL command from variable
_を選択しますデータアクセスモードUser::FetchTempData
_を選択します変数名Columns
ページをクリックしますColumns
のページOLE DB Source Editorをクリックすると、テーブル_##tmpStateProvince
_ソースコマンド変数で指定されたものが存在せず、SSISが列定義を読み取れません。
エラーを修正するには、データベースでSQL Server Management Studio(SSMS)を使用してステートメント_EXEC dbo.PopulateTempTable
_を実行しますSora
これにより、ストアドプロシージャは一時テーブルを作成します。ストアドプロシージャを実行した後、Columns
OLE DB Source Editorのページをクリックすると、列情報が表示されます。 OK
をクリックします。
_OLE DB Destination
_をData Flowタブにドラッグアンドドロップします。緑の矢印をOLE DB SourceからOLE DB Destinationに接続します。 _OLE DB Destination
_をダブルクリックして開きますOLE DB Destination Editor。
OLE DB Destination Editorの_Connection Manager
_ページで、次のアクションを実行します。
KIWI\SQLSERVER2008R2.Sora
_ from OLE DB Connection Managerを選択しますTable or view - fast load
_を選択しますデータアクセスモード[dbo].[StateProvince]
_ from Name from the table or viewMappings
ページをクリックしますMappings
のOLE DB Destination Editorをクリックすると、入力列名と出力列名が同じ場合に列が自動的にマップされます。 OK
をクリックします。列StateProvinceID
には一致する入力列がなく、データベースのIDENTITY
列として定義されています。したがって、マッピングは必要ありません。
データフロータブは、すべてのコンポーネントを構成した後、次のようになります。
データフロータブの_OLE DB Source
_をクリックし、F4を押してProperties
を表示します。プロパティValidateExternalMetadata
をFalseに設定して、SSISがパッケージ実行の検証フェーズ中に一時テーブルの存在をチェックしないようにします。
SQL Server Management Studio(SSMS)で_select * from dbo.StateProvince
_クエリを実行して、テーブル内の行数を見つけます。パッケージを実行する前に空にする必要があります。
パッケージを実行します。制御フローは実行の成功を示します。
[データフロー]タブで、パッケージが6行を正常に処理したことがわかります。この投稿の早い段階で作成されたストアドプロシージャは、6行を一時テーブルに挿入しました。
SQL Server Management Studio(SSMS)でクエリ_select * from dbo.StateProvince
_を実行して、テーブルに正常に挿入された6行を見つけます。データは、ストアドプロシージャで見つかった行と一致する必要があります。
上記の例は、パッケージ内で一時テーブルを作成して使用する方法を示しています。
私はこのパーティーに遅れていますが、user756519の徹底した優れた回答に少し加えたいと思います。私の最近の経験に基づいて、このインスタンスに「接続マネージャーのRetainSameConnection」プロパティが関連しているとは思わない。私の場合、関連するポイントは、「ValidateExternalMetadata」をFalseに設定するというアドバイスでした。
一時テーブルを使用して、あるデータベース(およびサーバー)から別のデータベース(およびサーバー)へのデータのコピーを容易にしているため、特定のケースでは「RetainSameConnection」の理由は関係ありません。そして、この例で起こっていることを、それができる限り徹底的に達成することも重要だとは思いません。