我在执行脚本任务时遇到问题。当前任务正在执行存储过程,结果被赋值给变量。现在,我想在单个执行任务中同时执行存储过程和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任务中,我已经将变量
我将变量的结果设置为两个变量
当我尝试运行package时,无法将输出值获取到结果变量。请让我知道怎样才能摆脱上面的sql。
发布于 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到信息事件日志中
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将使用方括号、首选或双引号(如有必要)。
https://stackoverflow.com/questions/69984020
复制相似问题