这似乎是非常简单的解决方案,但我无法弄明白。请帮忙。
我必须使用来自另一个存储过程的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".
答案 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语句结合使用。