我有一个回归错误的过程: 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)。