发布
社区首页 >问答首页 >在存储过程中使用带游标的参数

在存储过程中使用带游标的参数
EN

Database Administration用户
提问于 2021-06-10 08:34:38
回答 1查看 45关注 0票数 0

我使用获得日期的SP作为参数,我试图在查询中使用变体,但SQL似乎没有“看到”它

代码语言:javascript
代码运行次数:0
复制
alter procedure PipeReport
  @1 as DATE
as
begin

DECLARE @SqlCD NVARCHAR(MAX) 
DECLARE @Thickness NVARCHAR(100)

--DECLARE @SlpCode INT

SET @SqlCD = N'
/* SELECT FROM  [dbo].[ORDR]  T2 */
 

  declare   @1 as DATE

SELECT C0.DocNum ,OI.ItemName'

/* הנתונים שעליהם רצה הלולאה */
DECLARE SizeList CURSOR FOR

       SELECT 

            cast( R1.U_Thickness as nvarchar)--+''/''

       FROM
              RDR1 R1
              INNER JOIN ORDR R ON R1.DocEntry = R.DocEntry
       WHERE
              R.U_ImpDate=@1
                            and 
              R1.[U_Shelf] is null
                       and 
R1.[LineStatus]=N'O'
       GROUP BY
              U_Thickness
                       
       HAVING 
       R1.U_Thickness IS NOT NULL 
       AND 
       R1.U_Thickness > 0 



OPEN SizeList


FETCH NEXT FROM SizeList INTO @Thickness


WHILE @@FETCH_STATUS = 0
BEGIN
       SET @Thickness = ( SELECT TOP 1 U_Thickness FROM RDR1 WHERE U_Thickness = @Thickness)
       SET @SqlCD = @SqlCD + ',SUM( CASE WHEN T0.U_Thickness = ' + CONVERT(NVARCHAR(10),@Thickness) + N' THEN T0.Quantity END) AS N'' ' + @Thickness + N''' '
      
       FETCH NEXT FROM SizeList INTO @Thickness
END

SET @SqlCD = @SqlCD + N' FROM     
RDR1 T0   
INNER JOIN ORDR C0 ON C0.DocEntry = T0.DocEntry 
INNER JOIN OITM OI ON t0.ItemCode = OI.ItemCode
where 
C0.U_ImpDate = @1
AND 
T0.[U_Thickness] <>0 
and 
T0.[U_Shelf] is null
and 
OI.U_Group=400 
and 
T0.[LineStatus]=N''O''
AND C0.DocNum IS NOT NULL


Group BY ROLLUP(C0.DocNum),OI.ItemName
ORDER BY 1 DESC; '

CLOSE SizeList
DEALLOCATE SizeList

EXEC(@SqlCD)
end
EN

回答 1

Database Administration用户

发布于 2021-06-10 08:54:56

变量或参数仅在声明的范围内可见。参数@1在过程主体中是可见的,但在生成和执行过程的动态脚本中是不可见的。即使动态脚本声明的变量的名称和类型相同,@1参数的值也不会自动传递给它。

如果您想传递它,请使用EXEC sp_executesql <your query>而不是EXEC(<your query>)来运行动态SQL,因为前者允许您使用适当的参数化。在您的具体案例中,您需要做的是:

  1. 从动态SQL中删除declare @1 as DATE行。
  2. EXEC(@SqlCD)行替换为: EXEC sp_executesql @SqlCD,N'@1 DATE',@1;
票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/294056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档