我有一个返回错误的过程:

必须声明表变量"@PropIDs"。

但随后出现以下消息:

(受影响的 123 行)

当我执行它时出现错误

EXEC [dbo].[GetNeededProperties] '1,3,5,7,2,12', '06/28/2013', 'TT'

但工作正常时

EXEC [dbo].[GetNeededProperties] NULL, '06/28/2013', 'TT'

有人可以帮我吗?

CREATE PROCEDURE [dbo].[GetNeededProperties]
@NotNeededWPRNs nvarchar(max), --string like '1,2,3,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

答案

问题在于您将动态 SQL 与非动态 SQL 混淆了。

首先 - 当您将 NULL 放入 @NotNeededWPRNs 时它起作用的原因是因为当该变量为 NULL 时,您的 @ProductsSQL 变为 NULL。

您需要做的是将 @PropsIDs 表设置为非表变量,并将其设置为临时表或物理表。

所以简单的方法是做这样的事情:

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 Address,
    p.Address AS Street
      FROM [dbo].[Properties] AS p
    WHERE 
       p.WPRN NOT IN( SELECT ID FROM @PropIDs)
    '

和执行。

来自: stackoverflow.com