【问题标题】:Facing issue with Execute Sql Task面临执行 Sql 任务的问题
【发布时间】:2021-12-27 05:28:30
【问题描述】:

我遇到了执行脚本任务的问题。 当前任务正在执行存储过程,结果分配给变量。 现在我想在单次执行任务中同时执行存储过程和 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。

【问题讨论】:

  • 当您写“无法将输出值获取到结果变量”时,您的意思是什么?任务出错了吗?当任务完成时,您的用户变量不包含预期值,还有什么?
  • 任务成功,但用户变量没有应该作为任务的一部分执行的 sql 查询的输出值。如果 sql 查询或我的方法有任何问题,请告诉我
  • 如果您将执行 SQL 任务的内容替换为简化的 SELECT 0 AS 'TCId', CAST(1 AS bit) as 'IsSuccess',您看到分配的值了吗?无论哪种方式,您如何确定该值是否已分配?
  • 现在我看到我收到错误“[执行 SQL 任务] 错误:为变量“TCId”赋值时出错:“HRESULT 异常:0xC0015005”。我将变量添加到观察窗口并放断点看值是否变化

标签: ssis ssis-2012


【解决方案1】:

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

您的执行 SQL 任务有 3 个变量在起作用。无论您在第一个屏幕截图中划掉了什么,我将其命名为 User::SQLSource 并且是字符串类型。我将其定义为SELECT 0 AS TCId, CAST(1 AS bit) as IsSuccess;

我有两个用于结果集的变量。 User::IsSuccess 是布尔类型,User::TCId 是 Int32 类型。

SCR 回显

我喜欢这样的脚本任务将echo the value of variables 写入信息事件日志

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 2021-11-22
    • 1970-01-01
    • 2011-04-23
    • 2019-01-30
    • 1970-01-01
    相关资源
    最近更新 更多