首页 > 解决方案 > 面临执行 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 任务中,我分配了变量

在此处输入图像描述

我将变量的结果设置为两个变量 在此处输入图像描述 当我尝试运行包时,无法将输出值获取到结果变量。请让我知道我怎样才能摆脱上面的sql。

标签: ssisssis-2012

解决方案


你的包的一个简单版本可以工作,所以让我们分解它。

在此处输入图像描述

您的 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 会使用方括号、首选或双引号。


推荐阅读