我正在SSIS $ ./script.sh
[Usage]
$ ./script.sh --scan
Specify scan type
$ ./script.sh --help --scan
[Usage]
$ ./script.sh --scan short
Specify keyword to search
$ ./script.sh --scan short keyword
[Starts short scanning for "keyword" - go to function where my script is, blah, blah]
$ ./script.sh keyword --scan short
[As above]
$ ./script.sh keyword
[Usage]
任务中运行以下T-SQL语句:
Execute T-SQL Statement
当从SSMS中运行脚本时,它会返回两个计数:
(69行(s)受影响)
(217行(s)受影响)
如何捕获第一个计数并将其分配给SSIS变量?在这种情况下,BEGIN TRANSACTION
BEGIN TRY
INSERT FooTable (...)
SELECT ...
FROM FooTableStaging ts
WHERE NOT EXISTS (
SELECT id
FROM FooTable
WHERE id=ts.id
);
-- reset staging table
DELETE
FROM FooTableStaging
;
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
...
END CATCH
不会等于217吗?
**编辑**
使用@@ROWCOUNT
连接类型。
答案 0 :(得分:2)
可能有几种方法可以做到,但我认为最简单的方法是在脚本中添加以下3个新行
-- line 1 Make a variable to hold the desired value
DECLARE @NewRowCount int;
BEGIN TRANSACTION
BEGIN TRY
INSERT FooTable (...)
SELECT ...
FROM FooTableStaging ts
WHERE NOT EXISTS (
SELECT id
FROM FooTable
WHERE id=ts.id
);
-- Line 2 Capture the intended count
SELECT @NewRowCount = @@ROWCOUNT;
-- reset staging table
DELETE
FROM FooTableStaging
;
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
...
END CATCH
-- Line 3 Make a single row return statement
SELECT @NewRowCount AS NewRowCount;
现在,您需要让执行SQL任务“听到”该行,因此将结果集类型从默认的None
更改为SingleRow
。在“结果集”选项卡中,单击“添加”按钮,结果集名称0将映射到User :: MyVariableCount或您调用的任何名称。
SSIS域中有两个类似命名的任务可供我们使用。数据库维护/其他任务下可用的远远,更常见的Execute SQL Task
和Execute T-SQL Statement Task
(取决于您的SSIS版本)。
执行SQL任务可以使用OLE,ODBC或ADO.NET连接管理器。 T-SQL任务仅支持ADO.NET连接管理器。
执行SQL任务能够接受参数并返回结果集,并使用SSIS变量或文件作为查询源。执行T-TSQ任务不接受任何参数,不提供输出,只能使用硬编码查询。
鉴于上述情况,我知道在任何情况下我都不会在执行SQL任务上使用执行T-SQL语句任务。交换现有任务以使用执行SQL任务,你会很高兴。否则,答案就是无法完成。
它对我有用,不知道在执行SQL任务返回单行结果集时遇到了什么错误。
为了简化这个过程,我跳过了上面SQL中最后一行的所有内容来进行查询SELECT 1 AS NewRowCount;
我创建了两个类型为Int32的两个SSIS变量User::RowCountNewADO
和User::RowCountNewOLE
我的执行SQL任务配置如图所示
因此设置了结果集选项卡
如果我没有演示Biml,那对我来说不是一个合适的SSIS答案。商业智能标记语言Biml允许我描述一个SSIS包,以便您可以在您的环境中重新创建它。您需要做的就是下载BIDS Helper这是Visual Studio的免费插件,可以帮助您完成SSIS / SSRS / SSAS开发体验。
安装完成后,右键单击您的SSIS项目并选择Add New Biml File。
将以下内容粘贴到BimlScript.biml文件
中编辑第3行和第4行以指向有效的服务器(除非您在dev2014
的本地计算机上运行命名实例)并保存。
右键单击BimlScript.biml并选择Generate SSIS Packages
运
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<AdoNetConnection Name="CM_ADO_DB" ConnectionString="Data Source=localhost\dev2014;Integrated Security=SSPI;Connect Timeout=30;Database=msdb;" Provider="SQL" />
<OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI11.0;Integrated Security=SSPI;"/>
</Connections>
<Packages>
<Package Name="so_34443637" ConstraintMode="Linear">
<Variables>
<Variable DataType="Int32" Name="RowCountNewADO">0</Variable>
<Variable DataType="Int32" Name="RowCountNewOLE">0</Variable>
</Variables>
<Tasks>
<ExecuteSQL
ConnectionName="CM_ADO_DB"
ResultSet="SingleRow"
Name="SQL - Get Row Count ADO">
<DirectInput>SELECT 1 AS NewRowCount;</DirectInput>
<Results>
<Result VariableName="User.RowCountNewADO" Name="0" />
</Results>
</ExecuteSQL>
<ExecuteSQL
ConnectionName="CM_OLE"
ResultSet="SingleRow"
Name="SQL - Get Row Count OLE">
<DirectInput>SELECT 1 AS NewRowCount;</DirectInput>
<Results>
<Result VariableName="User.RowCountNewOLE" Name="0" />
</Results>
</ExecuteSQL>
<ExecuteSQL ConnectionName="CM_OLE" Name="Breakpoint">
<DirectInput>SELECT 1 AS x;</DirectInput>
</ExecuteSQL>
</Tasks>
</Package>
</Packages>
</Biml>