“Doit déclarer la variable de table ”@name“” dans une procédure stockée

J'ai une procédure qui retourne l'erreur:

Doit déclarer la variable de table "@Propid".

Mais il est suivi par le message:

(123 ligne(s) affectée)

L'erreur s'affiche lorsque je l'exécuter avec

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

Mais qui fonctionne bien quand

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

Quelqu'un peut-il m'aider?
La procédure:

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)

J'ai trouvé de solution lors de la déclaration de tableau comme ceci:

IF OBJECT_ID('#PropIDs', 'U') IS NOT NULL
  DROP TABLE #PropIDs

CREATE  TABLE  #PropIDs

Mais lors de l'exécution de la procédure à partir de C# (linq, sql), il renvoie une erreur

Montrer comment êtes-vous invoquer SP à partir de c#?
Lorsque vous créez une table temporaire avec le # de la façon dont vous avez sa en fait stockées dans sql server et doit être supprimé une fois que vous avez terminé de l'utiliser, la table temporaire que vous avez créé est une variable scalaire et est propbably inaccessible à ce point
Petite chose: lorsque vous déclarez votre SQL dynamique variable de type nvarchar, vous devez utiliser N de déclarer les littéraux de chaîne: N'Insert into... ou de ne pas utiliser l'Unicode
'1,3,5,7,2,12' est un chaîne que vous soyez de passage pour votre procédure stockée, mais le IN (....) opérateur s'attend à ce une liste de valeurs - pas une seule chaîne! Vous devriez être en utilisant un paramètre table pour votre IDENTIFIANT qui vous permet de passer en plusieurs valeurs de l'appelant dans un bon, bien défini, et alors vous n'avez pas besoin de recourir à du SQL dynamique, soit! TVP sont disponibles dans SQL Server 2008 et les plus récents.
En aparté, sauf si vous travaillez dans la base de données TempDB, vous aurez besoin de préfixe de votre table temporaire avec TempDB.. dans cette ligne IF OBJECT_ID('#PropIDs', 'U') IS NOT NULL, c'est à dire IF OBJECT_ID('TempDB..#PropIDs', 'U') IS NOT NULL

OriginalL'auteur Tom | 2013-11-28