使用来自另一个存储过程的OUTPUT参数调用SQL存储过程

时间:2017-01-19 21:11:14

标签: sql-server stored-procedures parameters output

这似乎是非常简单的解决方案,但我无法弄明白。请帮忙。

我必须使用来自另一个存储过程的OUTPUT参数调用存储过程。我认为其中一个问题是动态SQL,但我不知道如何编写它,因为@SQLWhere将在C#代码中动态更改。

这是从另一个proc调用的proc:

ALTER PROCEDURE [dbo].[USP_RetrieveTotalRecord]
@SQLWhere AS NVARCHAR(1000),
@TotalRecordsFound as varchar(16) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
    DECLARE @SQL AS NVARCHAR(Max)
    SET @SQL='Select @TotalRecordsFound = Count(Table_ID)  
    From TableName Where ' + @SQLWhere 
    EXEC(@SQL)  
    return
END

以下是我从另一个proc中调用它的方法:

Declare @TotalRec AS NVARCHAR(16);
Declare @SQLWhere AS NVARCHAR(1000);
SET @SQLWhere='Date Between ''12/13/2016'' AND ''12/14/2016'''
EXECUTE  USP_RetrieveTotalRecord @SQLWhere, @TotalRec output;

以下是我要解决的错误:

Msg 137, Level 15, State 1, Line 30
Must declare the scalar variable "@TotalRecordsFound".

3 个答案:

答案 0 :(得分:0)

不确定为什么你有第二个SP,只需使用如下:

Declare @TotalRec AS NVARCHAR(16);
Declare @SQLWhere AS NVARCHAR(1000);
SET @SQLWhere='Date Between ''12/13/2016'' AND ''12/14/2016'''
 SET @SQL='Select @TotalRecordsFound = Count(Table_ID)  
    From TableName Where ' + @SQLWhere 
 EXEC(@SQL)

或者使用日期变量,如果你只是用于选择(不需要动态sql) - 除非这只是一个简化的例子

---评论部分被破坏,因此,为了获得一个值,请使用以下内容:

好的 - 最简单的方法是使用sp_ExecuteSQL

Declare @result int
Declare @sql nvarchar(max)
SET @SQL = ' SELECT COUNT(*) FROM MyTable'

exec sp_ExecuteSQL @sql, N' @Result int Output', @Result output

select @result as MyCount

答案 1 :(得分:0)

不要做你想做的事情,只将值传递给存储过程,然后在你的程序中构建动态sql,比如......

ALTER PROCEDURE [dbo].[USP_RetrieveTotalRecord]
   @StartDate   DATE = NULL
  ,@EndDate     DATE = NULL
  ,@TotalRecordsFound INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;

    DECLARE @SQL NVARCHAR(Max);
    SET @SQL = N' Select @TotalRecordsFound = Count(Table_ID) '
             + N' From TableName Where 1 =1 '
             + CASE WHEN  @StartDate IS NOT NULL THEN 
               N' AND [Date] >= @StartDate ' ELSE N' ' END
             + CASE WHEN  @EndDate IS NOT NULL THEN 
               N' AND [Date] <= @EndDate ' ELSE N' ' END

    EXEC sp_executesql @SQL  
                      ,N'@StartDate DATE, @EndDate DATE, @TotalRecordsFound INT OUTPUT'
                      ,@StartDate 
                      ,@EndDate
                      ,@TotalRecordsFound OUTPUT
END

现在@EndDate@StartDate变量是可选的,具体取决于您传递的变量值过程将相应地构建动态sql并返回结果。

同时使用sp_executesql的参数化查询将保护您免受可能的SQL注入附加,并且您的proc将受益于参数化执行计划。

答案 2 :(得分:0)

微米。 Ali,感谢您的帮助,但我们在动态选择后从应用程序传递了所有SELECT,WHERE和GROUP by条件。我需要快速修复。 最后,我能够使用临时表解决问题。我知道他们不推荐,但我尝试使用Common表表达式,表变量,但@TotalRecordsFound在动态SQL之外是不可见的。因此,创建临时表,使用动态SQL将数据插入其中,然后将其与下一个select语句结合使用。