执行执行另一个存储过程的动态查询

时间:2018-07-30 20:05:38

标签: sql-server tsql

我有这样的查询:

DECLARE @TaskId UNIQUEIDENTIFIER
DECLARE @TaskName VARCHAR(255) = 'MasterSet'
DECLARE @sql NVARCHAR(MAX)

DECLARE @StartingDateTask DATETIME2 = (SELECT TOP 1 [Date]
                                       FROM [TaskStatusAudit]
                                       WHERE [TaskId] = 'A1FDFC16-904D-4560-B19D-5E7D4FEB1C2B'
                                         AND [TaskStatusName] = 'IN-PROGRESS')

DECLARE @EndingDateTask DATETIME2 = (SELECT TOP 1 [Date]
                                     FROM [TaskStatusAudit]
                                     WHERE [TaskId] = 'A1FDFC16-904D-4560-B19D-5E7D4FEB1C2B'
                                       AND [TaskStatusName] = 'COMPLETED')

 SET @sql = N'SELECT dbo.TotalMinuteRange(@StartingDateTask,@EndingDateTask) as ' + quotename(@TaskName) + N''

 EXEC sp_executesql @sql

问题是当我执行它时出现此错误:

  

必须声明标量变量“ @StartingDateTask”。

有什么主意,如果我正确声明了变量为什么会得到它?问候

2 个答案:

答案 0 :(得分:3)

在执行sp_executesql时,您需要声明变量并将其传递给sp_executesql之类的东西。

SET @sql = N'SELECT dbo.TotalMinuteRange(@StartingDateTask,@EndingDateTask) as ' 
         + quotename(@TaskName) + N''


 exec sp_executesql   @sql
                    , N'@StartingDateTask DATETIME2 , @EndingDateTask DATETIME2'
                    , @StartingDateTask 
                    , @EndingDateTask

第二个参数是变量声明参数,后跟实际变量。

答案 1 :(得分:0)

您也可以像接受参数变量一样进行分配。

声明@params nvarchar(100) 设置@params ='@ StartingDateTask DATETIME2,@ EndingDateTask DATETIME2'

SET @sql = N'SELECT dbo.TotalMinuteRange(@ StartingDateTask,@ EndingDateTask)为'          + quotename(@TaskName)+ N''

exec sp_executesql @sql                     ,@params                     ,@StartingDateTask                     ,@EndingDateTask