如何从使用表达式的执行SQL任务中捕获单行值?

时间:2012-10-31 21:17:00

标签: sql-server ssis expression

我使用以下表达式执行SQL任务:

@[User::SQLExportError] + (DT_WSTR,30)@[User::Id]

表达式正确评估为:

  select count(*) as ErrorTableCount from [myschema].Error 
    where SPName in ('export/INSERT','export/DELETE') and Id = 1000

在同一个sql任务中,我想将 as ErrorTableCount 捕获到一个结果集中,结果名为: ErrorTableCount 变量名称为:{{ 1}}

我正在接受红色圆圈/ x十字架告诉我:

User::ErrorTableCount

在使用sql源表达式和包含结果集下定义的复制计数名称的表达式之间似乎存在一些冲突。有什么建议/想法吗?

1 个答案:

答案 0 :(得分:6)

我无法确定您的方案中导致错误的原因。我试图根据问题重新创建场景。该示例可能会帮助您找出最终结果的不同之处。

创建一个名为 dbo.Error

的简单表
CREATE TABLE [dbo].[Error](
    [Id] [int] NOT NULL,
    [SPName] [varchar](20) NOT NULL
) ON [PRIMARY]
GO

使用以下脚本使用一些示例数据填充表格。

INSERT INTO dbo.Error (Id, SPName) VALUES 
    (1000, 'export/INSERT'),
    (1000, 'export/DELETE'),
    (1001, 'export/INSERT');
GO

在SSIS包上,创建连接管理器或数据源以连接到托管上述表的数据库。在此示例中,我创建了一个OLE DB连接管理器,因为它是SQL Server数据库的推荐提供程序,并将连接管理器命名为Practice。

在包上创建以下变量。

Variables

将变量Id设置为值1000,以便我们将在执行SQL任务中执行的查询将至少获取两行。

将变量SQLExportError设置为以下查询:

  

SELECT COUNT(Id)的AS ErrorTableCount FROM dbo.Error WHERE SPName在( '出口/ INSERT', '导出/删除')和Id =

选择变量SQLFetch,然后按F4查看属性。将属性 EvaluateAsExpression 设置为 True 。单击 Expression 属性的省略号按钮,然后设置以下表达式。

@[User::SQLExportError] + (DT_WSTR,30)@[User::Id]

Expression

将执行SQL任务拖放到控制流选项卡上。如下所示配置Execute SQL任务的General页面,以执行存储在表达式变量中的SQL查询。

Execute SQL Task - General

配置“结果集”页面以接受查询返回的值并将其存储在变量中。

Execute SQL Task - Result Set

添加脚本任务以查看存储在变量中的值。配置脚本任务以读取变量ErrorTableCount

Script Task

将以下C#代码添加到脚本任务中。

public void Main()
{
    MessageBox.Show(String.Format("Value in variable ErrorTableCount: {0}", 
        Dts.Variables["User::ErrorTableCount"].Value), 
        "Execute SQL Task - Single Row");
    Dts.TaskResult = (int)ScriptResults.Success;
} =

Script Task Code

关闭脚本任务编辑器。控制流程看起来像这样。

Control flow

在执行包,消息框应显示与计数的 2 ,因为这是在采样数据行已的Id设定为值的数目1000中。

希望能帮助您找到配置的错误。

Package execution