ssis - 面临执行 Sql 任务的问题
问题描述
我在执行脚本任务时遇到问题。当前任务正在执行存储过程,结果分配给变量。现在我想在单次执行任务中同时执行存储过程和 sql select 语句,我试图通过使用动态 sql 语句来实现它,如下所示。
SQL 脚本
DECLARE @Query NVARCHAR(250)
DECLARE @ParmDefinition NVARCHAR(250)
DECLARE @Id int
DECLARE @Usr_Id VARCHAR(50)
DECLARE @TCId INT
DECLARE @IsSuccess bit
Set @Query = 'Exec InsertSp @Id,@Usr_Id,@TCId OUTPUT'
SET @ParmDefinition = '@Id INT,@Usr_Id VARCHAR(50),@TCId INT OUTPUT'
EXEC sp_executesql @Query,
@ParmDefinition,
@Id=2,
@Usr_Id='domain\fn.lastname',
@TCId=@TCId OUTPUT
Set @Query = 'SELECT TOP (1) @IsSuccessOut = IsSuccess
FROM dbo.TableA AS a
INNER JOIN dbo.TableB AS b
ON a.Id = b.Id
WHERE (b.Name = ''LoadDaily'')
ORDER BY StartTime DESC'
SET @ParmDefinition = '@IsSuccessOut INT OUTPUT'
EXEC sp_executesql @Query,@ParmDefinition,@IsSuccessOut=@IsSuccess output
SELECT @TCId AS 'TCId',@IsSuccess as 'IsSuccess'
我创建了变量并将上面的查询分配给它。
在执行 SQl 任务中,我分配了变量
解决方案
你的包的一个简单版本可以工作,所以让我们分解它。
您的 Execute SQL Task 有 3 个变量在起作用。无论您在第一个屏幕截图中划掉什么,我都会调用它,它User::SQLSource
是 String 类型的。我将其定义为SELECT 0 AS TCId, CAST(1 AS bit) as IsSuccess;
我有两个用于结果集的变量。User::IsSuccess
这是一个布尔类型,User::TCId
它是 Int32 类型。
SCR 回波
我喜欢这样的脚本任务,将变量的值回显到信息事件日志中
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
namespace ST_EchoBack
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
bool fireAgain = false;
string message = "{0}::{1} : {2}";
foreach (var item in Dts.Variables)
{
Dts.Events.FireInformation(0, "SCR Echo Back", string.Format(message, item.Namespace, item.Name, item.Value), string.Empty, 0, ref fireAgain);
}
Dts.TaskResult = (int)ScriptResults.Success;
}
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
}
}
哪里出错了?
您应该能够重新创建我在此处显示的内容并获得相同的结果。完成后,开始重新添加更复杂的部分。
鉴于您的错误
执行 SQL 任务:为变量“TCId”赋值时出错
我可以通过在生成结果集的执行 SQL 任务中进行查询来重新创建相同的错误。
只要不生成记录集,多语句就可以了
DECLARE @foo int;
SELECT @foo = 1 FROM sys.tables AS T;
SELECT 0 AS TCId, CAST(1 AS bit) AS IsSuccess;
产生结果的查询,将
DECLARE @foo int;
SELECT @foo = 1 FROM sys.tables AS T;
-- This will mess things up.
SELECT 1, 1 FROM sys.tables;
SELECT 0 AS TCId, CAST(1 AS bit) AS IsSuccess;
我会采用您现有的查询并在 SSMS 中运行它。您的 sp_executesql 之一正在生成结果集。也可能有一个与之相关的触发器InsertSp
正在生成结果集,并且会破坏元数据。
我要指出的另一件事是,您不需要在您的最终语句中用单引号为您的列起别名。如果您必须处理命名不佳的列,SQL Server 会使用方括号、首选或双引号。
推荐阅读
- reactjs - 未处理的拒绝(TypeError):比较 id 时无法读取未定义的属性“”
- version - 如何从 CorDapp 代码访问 versionInfo?
- javascript - 如何立即使用在 WebStorm 中从 html 生成的 TypeScript?
- php - 在php中使用相同的数组键对多维数组进行排序
- javascript - 对键值的双数据绑定对象,用于下拉列表
- java - 为什么我们在资源和授权服务器中需要完全相同的配置
- angular - 遵循 i18n 与 JIT 编译器集成的官方教程,网站仍然是英文
- python - 使用 sys.odcinumberlist 作为参数从 python 执行 PL/SQL 过程
- java - 如何将文本文件中的不同数据存储到 ArrayLists 中?
- security - 将任何用户文件上传到 S3 存储桶是否安全?