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

pld*_*llo 0 sql-server expression ssis

我有一个使用此表达式的执行SQL任务:

@[User::SQLExportError] + (DT_WSTR,30)@[User::Id]
Run Code Online (Sandbox Code Playgroud)

表达式正确评估为:

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

在这个相同的sql任务中,我想要as ErrorTableCount将ResultName 捕获到单行结果集中:ErrorTableCount变量名称:User::ErrorTableCount

我得到红色圆圈/ x十字架告诉我:

There were errors during task validation.
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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

创建一个名为dbo.Error的简单表

CREATE TABLE [dbo].[Error](
    [Id] [int] NOT NULL,
    [SPName] [varchar](20) NOT NULL
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO dbo.Error (Id, SPName) VALUES 
    (1000, 'export/INSERT'),
    (1000, 'export/DELETE'),
    (1001, 'export/INSERT');
GO
Run Code Online (Sandbox Code Playgroud)

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

在包上创建以下变量.

变量

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

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

SELECT COUNT(Id)AS ErrorTableCount FROM dbo.Error WHERE SPName in('export/INSERT','export/DELETE')AND Id =

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

@[User::SQLExportError] + (DT_WSTR,30)@[User::Id]
Run Code Online (Sandbox Code Playgroud)

表达

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

执行SQL任务 - 常规

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

执行SQL任务 - 结果集

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

脚本任务

将以下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;
} =
Run Code Online (Sandbox Code Playgroud)

脚本任务代码

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

控制流

执行包时,消息框应显示计数2,因为这是样本数据中Id设置为值1000的行数.

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

包执行