Saklı yordam sonuçlarını SSIS değişkenine atama


9

Saklı bir yordamdan bir SSIS değişkenine değeri almaya çalışıyorum ve sonra bir ifade eklediğimde iki SSIS görevinin çalışıp çalışmadığını görmek için test. Yani bir örnek için, bu saklı yordamı kullanmaya çalışıyorum :

resim açıklamasını buraya girin

Belki de SSIS değişken özelliklerini tamamen yanlış ayarlıyorum, çünkü saklı proc değerinin bir SSIS değişkenine içe aktarılması için bunu doğru şekilde yapıp yapmadığımı da bilmiyorum. Başka bir şeyin daha fazla ekran görüntüsüne ihtiyacınız varsa lütfen bana bildirin.

Görev örneği:

resim açıklamasını buraya girin

İşte Öncelik Kısıtlama Editörü ekran görüntüsü:

resim açıklamasını buraya girin

Ve ilk görevin özellikleri:

resim açıklamasını buraya girin

Bu duruma göre ilerlemesini (veya başarısız olmasını) istiyorum. Ama test ettiğimde, süreç ne olursa olsun ilk görevden ikinciye akıyor ve bana sadece ilk görev için "% 100 tamamlandı" gösteriyor ve bu ifadenin doğru olup olmadığını kontrol etmediği konusunda hiçbir şey göstermiyor. Böyle bir şeyi nasıl yapabilirim ve sorun nedir? SSIS saklı proc değerini almak için 'orderCount' adlı bir değişken var.


1
İlk Execute SQL görevinizde, Saklı Yordamın çıktısını geri atamanız gerekir@[User::orderCount]
Mark Sinkinson

O pencerede bir yere gider mi? (Son resim sonrası düzenleme olarak ekledim)
Ravi

1
Üzgünüm, Result Setsayfada. simple-talk.com/sql/ssis/…
Mark Sinkinson

Çok teşekkürler, başardı! İlk görevi geçer ve ikinciye geçer. "Bu değişkene iletilen değer 5'den küçükse, sonraki görevi yapmayın" demeye çalıştığım ifade nedeniyle devam etmemesini istiyorum.
Ravi

@ İkinci görevde "Devre dışı bırak" özelliği için bir ifade ayarlamayı deneyin @[User::orderCount]<5?(dt_bool)1:(dt_bool)0. Eğer başarılı olursanız, sonuçları bu konuya geri göndermeyi unutmayın. GL!
Peter Vandivier

Yanıtlar:


10

Bu işi yapmak için iki seçeneğiniz var. Ya bir Tek Sonuç Kümesi kullanabilir ya da ÇIKIŞ parametresini kullanabilirsiniz. Şu anda ikisini de doğru kullanmıyorsunuz.

OUTPUT parametresi

Saklı yordamınız, @OrderCountyönü olan bir parametreye sahip olarak tanımlanırOUTPUT

Saklı yordamı SSMS, .NET gibi bir araçta kullanmak isteseydiniz, şöyle bir şey olurdu:

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

Yukarıdakileri belirtmeden çalıştırmak OUTPUTancak @orderCount değerine bakmak geçerlidir. 1435'ten 0'a değişir.

SSIS içinde SQL Görevi Yürüt kullandığınızda da aynısı geçerlidir. Parametrenin ÇIKIŞ üzerinde olduğunu ve ayrıca Parametre eşlemeleri sekmesinde belirtmeniz gerekir.

OUTPUT yantümcesini ve parametre yer tutucusunu belirtme

Ayrıca eşlemek istediğiniz değişkeni belirtin ve ÇIKIŞ yönünü orada kullanın. Burada sonucu Int32 türünde bir SSIS Değişkeni ile eşledimorderCount

resim açıklamasını buraya girin

Tek Sonuç Seti

Bunun doğru ilk bölümü var - sonuç kümesinin Tek Sıra olduğunu belirttiniz.

EXECUTE dbo.TestStoredProcSSVariable ?Bir giriş değeri belirtmeniz gerektiği için kullandığımı veya proc çağrısının kesileceğini (en azından tanımladığınız gibi) not edeceksiniz. Zor yerine bir değer kodlu olabilirdi ?beğendiniz0

resim açıklamasını buraya girin

Sonra, Sonuç Kümesi sekmesinde, burada ilk sütunu (sıfırıncı sıralı) adlı bir Değişkenle eşliyorum orderCountb

resim açıklamasını buraya girin

Sağlanan saklı yordamı çalıştırırsanız, orderCountb içinde bir değer elde edemezsiniz. Neden? Çünkü saklı yordam çağrısından hiçbir şey döndürmüyorsunuz. Saklı yordamın içine son bir açıklama ekledim

SELECT @OrderCount AS OrderCount;

Kendin Yap

Aşağıdaki yaklaşımları kullanarak her iki yaklaşımı da keşfedebilirsiniz. Biml nedir? İş Zekası İşaretleme Dili, BI için işletim sistemidir. Bunu önemsemeniz neden, bazı XML'leri bir SSIS paketine dönüştürmenize izin vermesidir. Tek yapmanız gereken ücretsiz addon BIDS Helper'ı indirip kurmaktır

TEKLİF Yardımcısı'nı yükledikten sonra,

  1. Projeye sağ tıklayın ve Yeni Biml dosyası ekle'yi seçin
  2. dosyanın içeriğini aşağıdaki XML ile değiştir
  3. 5. satırdaki değerleri düzeltin. Data SourceGerçek bir sunucuya güncelleyin ve ProviderSSIS sürümünüzle hizalayın. Ekran görüntünüze baktığınızda, bu muhtemelen SQLNCLI10.1 olacaktır
  4. BimlScript.biml'e sağ tıklayın ve SSIS Paketleri Oluştur'u seçin

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>

Aşağıdaki SSIS paketinin keyfini çıkarın

resim açıklamasını buraya girin


Bu inanılmaz faydalı ve bilgilendirici, çok teşekkür ederim, billinkc! Son derece yararlı yazı! Çok teşekkürler!
Ravi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.