Giả sử kết quả thủ tục được lưu trữ vào biến SSIS


9

Tôi đang cố gắng lấy giá trị từ một thủ tục được lưu trữ thành một biến SSIS và sau đó kiểm tra xem hai tác vụ SSIS có thể hoạt động hay không nếu tôi thêm một biểu thức. Vì vậy, ví dụ, tôi đang cố gắng sử dụng thủ tục được lưu trữ này :

nhập mô tả hình ảnh ở đây

Có thể tôi thậm chí đang thiết lập các thuộc tính biến SSIS hoàn toàn sai, vì tôi cũng không chắc liệu mình có đang thực hiện đúng cách để giá trị Proc được lưu trữ được nhập vào biến SSIS hay không. Xin vui lòng cho tôi biết nếu bạn cần thêm bất kỳ screencaps của bất cứ điều gì khác.

Dưới đây là ví dụ về nhiệm vụ:

nhập mô tả hình ảnh ở đây

Và đây là screencap Trình biên tập ưu tiên:

nhập mô tả hình ảnh ở đây

Và đây là thuộc tính cho nhiệm vụ đầu tiên:

nhập mô tả hình ảnh ở đây

Tôi muốn nó đi tiếp (hoặc thất bại) dựa trên điều kiện đó. Nhưng khi tôi kiểm tra nó, quá trình chuyển từ nhiệm vụ đầu tiên sang nhiệm vụ thứ hai bất kể và chỉ hiển thị cho tôi "hoàn thành 100%" cho nhiệm vụ đầu tiên và không có gì về việc liệu nó có kiểm tra biểu thức này có đúng hay không. Làm thế nào tôi có thể làm một điều như vậy và những gì đang xảy ra? Tôi có một biến trong SSIS được gọi là 'orderCount' để lấy giá trị từ Proc được lưu trữ.


1
Trong tác vụ SQL thực thi đầu tiên của bạn, bạn cần gán đầu ra của Quy trình được lưu trữ trở lại@[User::orderCount]
Mark Sinkinson

Nó sẽ đi đâu đó trong cửa sổ đó? (hình ảnh cuối cùng tôi vừa thêm vào dưới dạng chỉnh sửa bài đăng)
Ravi

1
Xin lỗi, trên Result Settrang. Simple-talk.com/sql/ssis/ từ
Mark Sinkinson

Cảm ơn rất nhiều, đã làm điều đó! Nó vượt qua nhiệm vụ đầu tiên và tiến tới thứ hai. Tôi muốn nó không đi trước vì biểu thức tôi đặt cố gắng nói "Nếu giá trị được truyền cho biến đó nhỏ hơn 5, đừng thực hiện tác vụ tiếp theo".
Ravi

@Jaywant trong tác vụ thứ hai, hãy thử đặt biểu thức cho thuộc tính "Vô hiệu hóa" một cái gì đó như @[User::orderCount]<5?(dt_bool)1:(dt_bool)0. Đừng quên gửi kết quả trở lại chủ đề này nếu thành công. GL!
Peter Vandivier

Câu trả lời:


10

Bạn có hai lựa chọn để thực hiện công việc này. Bạn có thể sử dụng Tập kết quả đơn hoặc bạn có thể sử dụng tham số OUTPUT. Bạn hiện đang sử dụng không chính xác.

Tham số OUTPUT

Quy trình được lưu trữ của bạn được định nghĩa là có tham số @OrderCounttheo hướngOUTPUT

Nếu bạn muốn sử dụng thủ tục được lưu trữ trong một công cụ, SSMS, .NET, bất cứ điều gì, nó sẽ trông giống như

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

Nó là hợp lệ để chạy ở trên mà không chỉ định OUTPUTnhưng nhìn vào giá trị của @orderCount. Nó thay đổi từ 1435 thành 0.

Điều tương tự cũng đúng khi bạn đang sử dụng Tác vụ SQL thực thi trong SSIS. Bạn phải xác định rằng tham số nằm trên OUTPUT và cũng chỉ định tham số đó trong tab Ánh xạ tham số.

Chỉ định mệnh đề OUTPUT và giữ chỗ tham số

Đồng thời chỉ định biến bạn muốn ánh xạ và sử dụng hướng OUTPUT ở đó. Ở đây tôi đã ánh xạ kết quả vào Biến SSIS loại Int32 được gọiorderCount

nhập mô tả hình ảnh ở đây

Tập kết quả duy nhất

Bạn có phần đầu tiên của chính xác này - bạn đã chỉ định rằng tập kết quả là Hàng đơn.

Bạn sẽ lưu ý rằng tôi đang sử dụng EXECUTE dbo.TestStoredProcSSVariable ?vì bạn phải chỉ định giá trị đầu vào hoặc cuộc gọi Proc sẽ bị ngắt (ít nhất là như bạn đã xác định). Bạn có thể đã mã hóa một giá trị thay cho ?tương tự0

nhập mô tả hình ảnh ở đây

Sau đó, trên tab Kết quả, ở đây tôi đang ánh xạ cột đầu tiên (thứ tự zeroth) thành Biến được gọi orderCountb

nhập mô tả hình ảnh ở đây

Nếu bạn chạy thủ tục được lưu trữ được cung cấp, bạn sẽ không nhận được giá trị trong orderCountb. Tại sao? Bởi vì bạn không trả lại bất cứ điều gì từ cuộc gọi thủ tục được lưu trữ. Tôi đã thêm một tuyên bố cuối cùng bên trong thủ tục lưu trữ của

SELECT @OrderCount AS OrderCount;

Tự làm

Bạn có thể khám phá một trong hai cách tiếp cận bằng cách sử dụng biml sau đây. Biml là gì? Ngôn ngữ đánh dấu thông minh nghiệp vụ là hệ điều hành cho BI. Tại sao bạn quan tâm đến nó là nó sẽ cho phép bạn chuyển đổi một số XML thành gói SSIS. Tất cả những gì bạn cần làm là tải xuống và cài đặt Trình trợ giúp BIDS miễn phí

Sau khi cài đặt BIDS Helper,

  1. Nhấp chuột phải vào dự án và chọn Thêm tệp Biml mới
  2. thay thế nội dung của tệp bằng XML sau
  3. Khắc phục các giá trị trong dòng 5. Cập nhật Data Sourcelên máy chủ thực và Providercăn chỉnh với phiên bản SSIS của bạn. Nhìn vào ảnh chụp màn hình của bạn, đây có thể sẽ là SQLNCLI10.1
  4. Nhấp chuột phải vào BimlScript.biml và chọn Tạo gói 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>

Tận hưởng gói SSIS sau

nhập mô tả hình ảnh ở đây


Điều đó cực kỳ hữu ích và nhiều thông tin, cảm ơn bạn rất nhiều, billinkc! Bài viết cực kỳ hữu ích! Cảm ơn rất nhiều!
Ravi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.