首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >面临执行Sql任务的问题

面临执行Sql任务的问题
EN

Stack Overflow用户
提问于 2021-11-15 21:08:21
回答 1查看 25关注 0票数 2

我在执行脚本任务时遇到问题。当前任务正在执行存储过程,结果被赋值给变量。现在,我想在单个执行任务中同时执行存储过程和sql select语句,我试图通过使用动态sql语句来获得它,如下所示。

SQl脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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任务中,我已经将变量

我将变量的结果设置为两个变量

当我尝试运行package时,无法将输出值获取到结果变量。请让我知道怎样才能摆脱上面的sql。

EN

回答 1

Stack Overflow用户

发布于 2021-11-16 19:37:05

您的包的一个简单版本可以工作,因此让我们对其进行分解。

执行SQL任务有3个变量在起作用。您在第一个屏幕截图中划掉的任何内容,我将其命名为User::SQLSource,类型为String。我将其定义为SELECT 0 AS TCId, CAST(1 AS bit) as IsSuccess;

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

SCR回显

我倾向于使用这样的脚本任务来echo the value of variables到信息事件日志中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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任务中创建一个生成结果集的查询来重新创建相同的错误。

只要不生成记录集,就可以使用多语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE @foo int;
SELECT @foo = 1 FROM sys.tables AS T; 

SELECT 0 AS TCId, CAST(1 AS bit) AS IsSuccess;

生成结果的查询将

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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将使用方括号、首选或双引号(如有必要)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69984020

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文