我有一个返回错误的过程:
Must declare the table variable “@PropIDs”.
但是跟着消息:
(123 row(s) affected)
当我执行它时出现错误
EXEC [dbo].[GetNeededProperties] '1,3,5,7,2,12','06/28/2013','TT'
但工作正常
EXEC [dbo].[GetNeededProperties] NULL,'TT'
有谁能帮助我吗?
步骤:
CREATE PROCEDURE [dbo].[GetNeededProperties] @NotNeededWPRNs nvarchar(max),--string like '1,4,5' @LastSynch datetime,@TechCode varchar(5) AS BEGIN DECLARE @PropIDs TABLE (ID bigint) Declare @ProductsSQL nvarchar(max); SET @ProductsSQL = 'Insert into @PropIDs (ID) SELECT [WPRN] FROM [dbo].[Properties] WHERE(WPRN in (' + @NotNeededWPRNs + '))' exec sp_executesql @ProductsSQL 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)
我在这样声明表格时找到了一些解决方案:
IF OBJECT_ID('#PropIDs','U') IS NOT NULL DROP TABLE #PropIDs CREATE TABLE #PropIDs
但是当从C#(linq sql)执行该过程时,它返回一个错误
解决方法
问题是您将动态SQL与非动态SQL混合在一起.
首先 – 当将NULL放入@NotNeededWPRNs中时,它的原因是因为当该变量为NULL时,您的@ProductsSQL将变为NULL.
您需要做的是使您的@PropsIDs表成为非表变量,也可以是临时表或物理表.
要么
您需要将所有内容都包含在动态SQL中并执行它.
所以简单的方法是做这样的事情:
Declare @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 Street FROM [dbo].[Properties] AS p WHERE p.WPRN NOT IN( SELECT ID FROM @PropIDs) '
并执行.或者如上所述 – 将@ProdID更改为临时表. (您在CREATE #ProdIds中接近的路由,但是您需要在sproc中的任何地方使用#ProdID而不是@ProdIDs).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。