sql – “必须在存储过程中声明表变量”@name“”

前端之家收集整理的这篇文章主要介绍了sql – “必须在存储过程中声明表变量”@name“”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个返回错误的过程:

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).

猜你在找的MsSQL相关文章