การกำหนดผลลัพธ์ของโพรซีเดอร์ที่เก็บไว้ให้กับตัวแปร SSIS


9

ฉันพยายามรับค่าจากโพรซีเดอร์ที่เก็บไว้ในตัวแปร SSIS แล้วทดสอบเพื่อดูว่างาน SSIS สองงานสามารถทำงานได้หรือไม่ถ้าฉันเพิ่มนิพจน์ ตัวอย่างเช่นฉันพยายามใช้โพรซีเดอร์ที่เก็บนี้ :

ป้อนคำอธิบายรูปภาพที่นี่

บางทีฉันอาจตั้งค่าคุณสมบัติตัวแปร SSIS ผิดทั้งหมดเพราะฉันยังไม่แน่ใจว่าฉันกำลังทำสิ่งนี้อย่างถูกวิธีหรือไม่สำหรับค่า proc ที่เก็บไว้เพื่อนำเข้าสู่ตัวแปร SSIS โปรดบอกฉันถ้าคุณต้องการ screencaps ของสิ่งอื่นใด

นี่คือตัวอย่างของงาน:

ป้อนคำอธิบายรูปภาพที่นี่

และนี่คือการแก้ไขข้อ จำกัด ก่อนหน้า screencap:

ป้อนคำอธิบายรูปภาพที่นี่

และนี่คือคุณสมบัติสำหรับงานแรก:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการให้มันไปข้างหน้า (หรือล้มเหลว) ตามเงื่อนไขนั้น แต่เมื่อฉันทดสอบกระบวนการจะไหลจากงานแรกไปที่สองโดยไม่คำนึงถึงและแสดงให้ฉันเห็นว่า "เสร็จสมบูรณ์ 100%" สำหรับงานแรกและไม่เกี่ยวกับว่าจะตรวจสอบว่านิพจน์นี้เป็นจริงหรือไม่ ฉันจะทำสิ่งนั้นได้อย่างไรและเกิดอะไรขึ้น? ฉันมีตัวแปรใน SSIS ที่เรียกว่า 'orderCount' เพื่อรับค่าจาก proc ที่เก็บไว้


1
ในงาน Execute SQL แรกของคุณคุณต้องกำหนดผลลัพธ์ของ Stored Procedure กลับไปที่@[User::orderCount]
Mark Sinkinson

มันจะไปที่ใดที่หนึ่งในหน้าต่างนั้นไหม (ภาพสุดท้ายที่ฉันเพิ่งเพิ่มเป็นการแก้ไขการโพสต์)
Ravi

1
ขออภัยบนResult Setหน้า simple-talk.com/sql/ssis/…
Mark Sinkinson

ขอบคุณมากที่ทำอย่างนั้น! มันผ่านภารกิจแรกและดำเนินต่อไปที่สอง ฉันต้องการให้ไม่ไปข้างหน้าเพราะนิพจน์ที่ฉันตั้งค่าพยายามที่จะพูดว่า "ถ้าค่าที่ส่งผ่านไปยังตัวแปรนั้นน้อยกว่า 5 อย่าทำงานต่อไป"
Ravi

@Jaywant ในงานที่สองลองตั้งค่าการแสดงออกสำหรับ "ปิด" @[User::orderCount]<5?(dt_bool)1:(dt_bool)0บางสิ่งบางอย่างเช่นสถานที่ให้บริการ อย่าลืมโพสต์ผลลัพธ์กลับไปที่กระทู้นี้ถ้าสำเร็จ GL!
Peter Vandivier

คำตอบ:


10

คุณมีสองทางเลือกในการทำงานนี้ คุณสามารถใช้ชุดผลลัพธ์เดียวหรือคุณสามารถใช้พารามิเตอร์ OUTPUT คุณใช้ไม่ถูกต้องในขณะนี้

พารามิเตอร์ OUTPUT

กระบวนงานที่เก็บไว้ของคุณถูกกำหนดว่ามีพารามิเตอร์@OrderCountพร้อมทิศทางOUTPUT

หากคุณต้องการใช้โพรซีเดอร์ที่เก็บไว้ภายในเครื่องมือ SSMS, .NET ไม่ว่ามันจะเป็นอย่างไร

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

สามารถเรียกใช้ข้างต้นได้โดยไม่ต้องระบุOUTPUTแต่ดูค่าของ @orderCount มันเปลี่ยนจาก 1435 เป็น 0

สิ่งนี้ยังคงเป็นจริงเมื่อคุณใช้ Execute SQL Task ภายใน SSIS คุณต้องระบุว่าพารามิเตอร์อยู่ใน OUTPUT และระบุไว้ในแท็บการแมปพารามิเตอร์

ระบุอนุประโยค OUTPUT และตัวยึดตำแหน่งพารามิเตอร์

ระบุตัวแปรที่คุณต้องการแมปและใช้ทิศทาง OUTPUT ที่นั่น ที่นี่ฉันได้แมปผลลัพธ์ลงใน SSIS Variable ของประเภท Int32 ที่เรียกว่าorderCount

ป้อนคำอธิบายรูปภาพที่นี่

ชุดผลลัพธ์เดี่ยว

คุณมีส่วนแรกของการแก้ไขนี้ - คุณระบุว่าชุดผลลัพธ์คือแถวเดี่ยว

คุณจะทราบว่าฉันกำลังใช้EXECUTE dbo.TestStoredProcSSVariable ?ในขณะที่คุณต้องระบุค่าการป้อนข้อมูลหรือโทร proc จะแตก (อย่างน้อยก็ตามที่คุณได้กำหนดไว้) คุณอาจจะได้เขียนยากค่าแทนของ?เช่น0

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นบนแท็บชุดผลลัพธ์ที่นี่ฉันกำลังทำแผนที่คอลัมน์แรก (ลำดับเลขศูนย์) กับตัวแปรที่เรียกว่า orderCountb

ป้อนคำอธิบายรูปภาพที่นี่

ถ้าคุณเรียกใช้กระบวนงานที่เก็บไว้ที่ระบุไว้คุณจะไม่ได้รับค่าใน orderCountb ทำไม? เนื่องจากคุณไม่ได้ส่งคืนสิ่งใดจากการเรียกกระบวนงานที่เก็บไว้ ฉันเพิ่มคำแถลงขั้นสุดท้ายภายในกระบวนงานที่เก็บไว้ของ

SELECT @OrderCount AS OrderCount;

ทำด้วยตัวคุณเอง

คุณสามารถสำรวจทั้งสองวิธีโดยใช้ biml ต่อไปนี้ biml คืออะไร Business Markup Language เป็นระบบปฏิบัติการสำหรับ BI ทำไมคุณถึงสนใจว่ามันจะช่วยให้คุณแปลง XML บางส่วนเป็นแพ็คเกจ SSIS สิ่งที่คุณต้องทำคือดาวน์โหลดและติดตั้ง Addon BIDS Helperฟรี

หลังจากติดตั้ง BIDS Helper

  1. คลิกขวาที่โครงการและเลือกเพิ่มไฟล์ Biml ใหม่
  2. แทนที่เนื้อหาของไฟล์ด้วย XML ต่อไปนี้
  3. แก้ไขค่าในบรรทัดที่ 5 อัพเดตData Sourceเซิร์ฟเวอร์จริงและProviderเพื่อให้สอดคล้องกับเวอร์ชัน SSIS ของคุณ ดูภาพหน้าจอของคุณซึ่งอาจเป็น SQLNCLI10.1
  4. คลิกขวาที่ BimlScript.biml และเลือกสร้างแพ็คเกจ 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>

เพลิดเพลินกับแพ็คเกจ SSIS ต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่


นั่นเป็นประโยชน์และให้ข้อมูลอย่างเหลือเชื่อขอบคุณมาก billinkc! โพสต์ที่เป็นประโยชน์มาก! ขอบคุณมาก!
Ravi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.