回答

收藏

存储过程中必须声明表变量的名称

技术问答 技术问答 243 人阅读 | 0 人回复 | 2023-09-14

我有一个回归错误的过程:
0 l% F9 J8 s4 r必须声明表变量 @PropIDs”。
% g3 {+ H: H$ X0 t
但随后出现了以下消息:: o' @+ i% O6 z
(123行受影响)# a. L. u; T8 X& h7 u. W1 \
使用下列命令时出现错误1 M# K& N, E# I% p
EXEC [dbo].[GetNeededProperties]06/28/2013TT'但在以下情况下,可以正常工作
$ k; [; r  q( _! F$ oEXEC [dbo].[GetNeededProperties] NULL,06/28/2013TT'有人能帮我吗?4 N) h5 k; b5 b3 r! y0 d
p.Address AS Street  FROM [dbo].[Properties] AS pWHERE    p.WPRN NOT IN( SELECT ID FROM @PropIDs)p.Address AS Street  FROM [dbo].[Properties] AS pWHERE    p.WPRN NOT IN( SELECT ID FROM @PropIDs)在声明这样的表格时,我找到了一个解决方案:, t% j" w% C* J& s& D% i
IF OBJECT_ID('#PropIDs','U') IS NOT NULL  DROP TABLE #PropIDsCREATE  TABLE  #PropIDs但是,当从C#(linq sql)在执行过程中,它将返回错误
8 m4 E. e1 a: Y& M" t                                                                2 L& u$ v3 k7 X/ R
    解决方案:                                                               
+ B  W) D& ?! N$ s: z( S5 V1 |                                                                问题是你在动态SQL与非动态SQL混淆在一起。+ r! Y- N" E* G
首先-将NULL放入@NotNeededWPRNs当变量为NULL时,您的@ProductsSQL变为NULL。
! [0 \  G" [) |* |3 r2 j你需要做的是使@PropsIDs表成为非表变量,并使其成为临时表或物理表。或者,您需要在动态中包装所有内容SQL中并执行。
, O4 ?2 p( \- p7 x% F4 m因此,简单的方法是执行以下操作:
$ t! Z% B" f9 `! y) P" p2 kDeclare @ProductsSQL nvarchar(max);    SET @ProductsSQL =     DECLARE @PropIDs TABLE    (ID bigint)    Insert into @PropIDs (ID)     SELECT [WPRN] FROM [dbo].[Properties] WHERE(WPRN in  @NotNeededWPRNs    )SELECT  p.WPRN AS ID,   p.Address  AS Address,   p.Address AS Street      FROM [dbo].[Properties] AS p    WHERE        p.WPRN NOT IN( SELECT ID FROM @PropIDs)    '并执行。或上述-将@ProdIDs改为临时表。CREATE% K  b6 d. {$ D& ]; a/ h. ]
ProdIds接近路由,但在存储过程中需要使用所有位置#ProdIDs而不是@ProdIDs)。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则