Assiging hasil prosedur tersimpan ke variabel SSIS

9

Saya mencoba untuk mendapatkan nilai dari prosedur tersimpan ke dalam variabel SSIS, dan kemudian menguji untuk melihat apakah dua tugas SSIS dapat berfungsi jika saya menambahkan ekspresi. Jadi sebagai contoh, saya mencoba menggunakan prosedur tersimpan ini :

masukkan deskripsi gambar di sini

Mungkin saya bahkan mengatur properti variabel SSIS sepenuhnya salah, karena saya juga tidak yakin apakah saya melakukan ini dengan cara yang benar untuk nilai proc yang disimpan untuk diimpor ke variabel SSIS. Tolong beritahu saya jika Anda membutuhkan screencaps apa pun.

Berikut ini contoh tugasnya:

masukkan deskripsi gambar di sini

Dan di sini adalah Precreence Constraint Editor screencap:

masukkan deskripsi gambar di sini

Dan di sini adalah properti untuk tugas pertama:

masukkan deskripsi gambar di sini

Saya ingin maju (atau gagal) berdasarkan kondisi itu. Tetapi ketika saya mengujinya, proses mengalir dari tugas pertama ke kedua terlepas, dan hanya menunjukkan kepada saya "100% selesai" untuk tugas pertama dan tidak ada tentang apakah itu memeriksa ungkapan ini menjadi benar atau tidak. Bagaimana saya bisa melakukan hal seperti itu dan apa yang salah? Saya punya variabel dalam SSIS yang disebut 'orderCount' untuk mendapatkan nilai dari proc yang disimpan.

Ravi
sumber
1
Dalam tugas Jalankan SQL pertama Anda, Anda perlu menetapkan output dari Prosedur Tersimpan kembali ke@[User::orderCount]
Mark Sinkinson
Apakah akan pergi ke suatu tempat di jendela itu? (gambar terakhir saya baru saja menambahkan sebagai posting edit)
Ravi
1
Maaf, di Result Sethalaman. simple-talk.com/sql/ssis/…
Mark Sinkinson
Terima kasih banyak, itu berhasil! Itu melewati tugas pertama dan melanjutkan ke yang kedua. Saya ingin tidak melanjutkan karena ekspresi yang saya tetapkan mencoba mengatakan "Jika nilai yang diteruskan ke variabel kurang dari 5, jangan lakukan tugas berikutnya".
Ravi
@Jaywant pada tugas kedua, coba atur ekspresi untuk properti "Disable" seperti @[User::orderCount]<5?(dt_bool)1:(dt_bool)0. Jangan lupa untuk memposting hasil kembali ke utas ini jika berhasil. GL!
Peter Vandivier

Jawaban:

10

Anda memiliki dua pilihan untuk membuat ini berfungsi. Entah Anda dapat menggunakan Set Hasil Tunggal atau Anda dapat menggunakan parameter OUTPUT. Saat ini Anda tidak menggunakan keduanya dengan benar.

Parameter OUTPUT

Prosedur tersimpan Anda didefinisikan memiliki parameter @OrderCountdengan arahOUTPUT

Jika Anda ingin menggunakan prosedur tersimpan dalam alat, SSMS, .NET, apa pun, itu akan terlihat seperti

DECLARE @orderCount int = 0;
EXECUTE dbo.TestStoredProcSSVariable @orderCount OUTPUT;
SELECT @orderCount As OrderCountVariable;

Ini valid untuk menjalankan di atas tanpa menentukan OUTPUTtetapi melihat nilai @orderCount. Itu berubah dari 1435 menjadi 0.

Hal yang sama berlaku ketika Anda menggunakan Execute SQL Task dalam SSIS. Anda harus menentukan bahwa parameternya adalah OUTPUT dan juga menentukannya di tab Pemetaan parameter.

Tentukan klausa OUTPUT dan penahan tempat parameter

Tentukan juga variabel yang ingin Anda petakan dan gunakan arah OUTPUT di sana. Di sini saya telah memetakan hasilnya menjadi Variabel SSIS dari tipe Int32 yang disebutorderCount

masukkan deskripsi gambar di sini

Set Hasil Tunggal

Anda memiliki bagian pertama yang benar ini - Anda telah menetapkan bahwa set hasil adalah Baris Tunggal.

Anda akan perhatikan bahwa saya menggunakan EXECUTE dbo.TestStoredProcSSVariable ?karena Anda harus menentukan nilai input atau panggilan proc akan terputus (setidaknya seperti yang Anda definisikan). Anda bisa mengkodekan nilai sebagai pengganti ?sejenisnya0

masukkan deskripsi gambar di sini

Kemudian, pada tab Set Hasil, di sini saya memetakan kolom pertama (zeroth ordinal) ke Variabel yang dipanggil orderCountb

masukkan deskripsi gambar di sini

Jika Anda menjalankan prosedur tersimpan yang disediakan, Anda tidak akan mendapatkan nilai di orderCountb. Mengapa? Karena Anda tidak mengembalikan apa pun dari panggilan prosedur tersimpan. Saya menambahkan pernyataan terakhir di dalam prosedur tersimpan

SELECT @OrderCount AS OrderCount;

Lakukan sendiri

Anda dapat menjelajahi kedua pendekatan menggunakan biml berikut. Apa itu biml? Bahasa Markup Intelijen Bisnis adalah sistem operasi untuk BI. Mengapa Anda peduli tentang hal itu adalah bahwa hal itu akan memungkinkan Anda untuk mengubah beberapa XML menjadi paket SSIS. Yang perlu Anda lakukan adalah mengunduh dan menginstal pembantu BIDS addon gratis

Setelah menginstal BIDS Helper,

  1. Klik kanan pada proyek dan pilih Tambahkan file Biml baru
  2. ganti konten file dengan XML berikut
  3. Perbaiki nilai di baris 5. Perbarui Data Sourceke server nyata dan Provideruntuk menyelaraskan dengan versi SSIS Anda. Melihat tangkapan layar Anda, ini kemungkinan adalah SQLNCLI10.1
  4. Klik kanan pada BimlScript.biml dan pilih Hasilkan Paket SSIS

Bimlscript.biml

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <Connection
            Name="tempdb"
            ConnectionString="Data Source=.\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;"
            />
    </Connections>
    <Packages>
        <Package
            Name="dba_114775"
            ConstraintMode="Linear"
        >
            <Tasks>
                <ExecuteSQL
                    ConnectionName="tempdb"
                    Name="SQL Make procedure">
                    <DirectInput>
                        <![CDATA[IF EXISTS
(
    SELECT
        *
    FROM
        sys.procedures AS P 
        INNER JOIN 
            sys.schemas AS S
            ON S.schema_id = P.schema_id
    WHERE
        S.name = 'dbo'
        AND P.name = 'TestStoredProcSSVariable'
)
BEGIN
    DROP PROCEDURE dbo.TestStoredProcSSVariable
END
GO
CREATE PROCEDURE dbo.TestStoredProcSSVariable
(
    @OrderCount int OUTPUT
)
AS
BEGIN
    SET NOCOUNT ON;

    SET @OrderCount = 1135;
    SELECT @OrderCount AS OrderCount;
END

GO

]]>
                    </DirectInput>

                </ExecuteSQL>
                <Container Name="SEQC Result set" ConstraintMode="Linear">
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="SQL Make procedure.Output"></Input>
                        </Inputs>
                    </PrecedenceConstraints>
                    <Tasks>
                        <ExecuteSQL
                              ConnectionName="tempdb"
                              ResultSet="SingleRow"
                              Name="SQL SingleRow">
                            <DirectInput>EXECUTE dbo.TestStoredProcSSVariable ?;</DirectInput>
                            <Results>
                                <Result VariableName="User.orderCountb" Name="0" />
                            </Results>
                            <Parameters>
                                <Parameter DataType="Int32" VariableName="User.orderCountb" Name="0" />
                            </Parameters>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="SQL Placeholder">
                            <DirectInput>SELECT 1;</DirectInput>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="Execute SQL Task 2">
                            <DirectInput>SELECT 1;</DirectInput>
                            <PrecedenceConstraints>
                                <Inputs>
                                    <Input 
                                        OutputPathName="SQL Placeholder.Output" 
                                        EvaluationOperation="ExpressionAndConstraint" 
                                        EvaluationValue="Success" 
                                        Expression="@[orderCount] &lt; 5" />
                                </Inputs>
                            </PrecedenceConstraints>
                        </ExecuteSQL>
                    </Tasks>
                </Container>
                <Container Name="SEQC Output Parameter" ConstraintMode="Linear">
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="SQL Make procedure.Output"></Input>
                        </Inputs>
                    </PrecedenceConstraints>
                    <Tasks>
                        <ExecuteSQL
                              ConnectionName="tempdb"
                              Name="SQL Output parameter">
                            <DirectInput>EXECUTE dbo.TestStoredProcSSVariable ? OUTPUT;</DirectInput>
                            <Parameters>
                                <Parameter 
                                    DataType="Int32" 
                                    VariableName="User.orderCount" 
                                    Name="0" 
                                    Direction="Output" />
                            </Parameters>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="SQL Placeholder">
                            <DirectInput>SELECT 1;</DirectInput>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="Execute SQL Task 2">
                            <DirectInput>SELECT 1;</DirectInput>
                            <PrecedenceConstraints>
                                <Inputs>
                                    <Input 
                                        OutputPathName="SQL Placeholder.Output" 
                                        EvaluationOperation="ExpressionAndConstraint" 
                                        EvaluationValue="Success" 
                                        Expression="@[orderCount] &lt; 5" />
                                </Inputs>
                            </PrecedenceConstraints>
                        </ExecuteSQL>

                    </Tasks>
                </Container>
                <ExecuteSQL ConnectionName="tempdb" Name="SQL Placeholder">
                    <DirectInput>SELECT 1;</DirectInput>
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="SEQC Result set.Output" />
                            <Input OutputPathName="SEQC Output Parameter.Output" />
                        </Inputs>
                    </PrecedenceConstraints>
                </ExecuteSQL>
            </Tasks>
            <Variables>
                <Variable DataType="Int32" Name="orderCount">-1</Variable>
                <Variable DataType="Int32" Name="orderCountb">-1</Variable>
            </Variables>
        </Package>
    </Packages>
</Biml>

Nikmati paket SSIS berikut

masukkan deskripsi gambar di sini

billinkc
sumber
Itu sangat membantu dan informatif, terima kasih banyak, billinkc! Posting yang sangat membantu! Terima kasih banyak!
Ravi