Sql server 如何从使用表达式的执行SQL任务中捕获单行值?
我有一个使用以下表达式的执行SQL任务:Sql server 如何从使用表达式的执行SQL任务中捕获单行值?,sql-server,ssis,expression,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捕获到
@[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变量名为:User::ErrorTableCount
我看到红色圆圈/x十字告诉我:
There were errors during task validation.
为sql源使用表达式与在该表达式中包含在结果集下定义的配音计数名称之间似乎存在一些冲突。有什么建议/想法吗?我无法确定是什么原因导致了您的场景中的错误。我试着根据这个问题重新创建场景。这个例子可能会帮助你找出你这方面的不同之处 创建一个名为dbo.Error的简单表 使用下面的脚本使用一些示例数据填充表
INSERT INTO dbo.Error (Id, SPName) VALUES
(1000, 'export/INSERT'),
(1000, 'export/DELETE'),
(1001, 'export/INSERT');
GO
在SSIS包上,创建连接管理器或数据源以连接到承载上述表的数据库。在本例中,我创建了一个OLE DB连接管理器,因为它是SQL Server数据库的推荐提供程序,并将连接管理器命名为Practice
在包上创建以下变量
将变量Id设置为值1000,以便我们将在执行SQL任务中执行的查询将获取至少两行
将变量SQLExportError设置为以下查询:
从dbo中选择COUNTId作为ErrorTableCount。SPName在“导出/插入”、“导出/删除”和Id中出现错误=
选择变量SQLFetch并按F4键查看属性。将属性evaluatesExpression设置为True。单击Expression属性的省略号按钮并设置以下表达式
@[User::SQLExportError] + (DT_WSTR,30)@[User::Id]
将执行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;
} =
关闭脚本任务编辑器。控制流看起来像这样
执行包时,消息框应显示计数2,因为这是示例数据中Id设置为1000的行数
希望这能帮助您找到配置中的错误
@Siva,它是一个名为SQLExportError的变量,与Id变量连接在一起。您应该验证连接测试是否正常。将结果集配置为单行,在结果集页面中设置变量,将表达式放入SQLStatementSource,如果仍然不起作用,我们需要更多信息来帮助您:湿婆,非常感谢你花了这么多时间。关键是SQLFetch并相应地设置源变量。尽管我已经生成了@Rednaxel提到的所有步骤,但第二个变量是为了避免验证冲突并允许此流程工作。再次感谢你。
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;
} =