2012-11-08 3 views
0

Je ne peux pas sembler obtenir le paramètre de sortie à droite, il est vide où je suis exepecting « TEMPTABLE »?paramètre de sortie dans la procédure stockée est nulle

create table TEMPTABLE 
(
    Id int identity primary key, 
    Name nvarchar(50) not null, 
); 
GO 

insert into TEMPTABLE(Name) values('Name 1'); 
GO 

DECLARE @PARMOUTP nvarchar(50) 
DECLARE @ParameterDefinition AS NVARCHAR(2000) 
DECLARE @DestTable VARCHAR(50) 
declare @sql nvarchar(max) 

    set @sql = 'SELECT OBJECT_NAME(OBJECT_ID) AS TABLENAME 
       FROM  SYS.IDENTITY_COLUMNS 
       WHERE OBJECT_NAME(OBJECT_ID) = @DestTable' 

set @DestTable = 'TEMPTABLE' 

set @ParameterDefinition = '@DestTable VARCHAR(50), @PARMOUTP VARCHAR(50) OUTPUT' 


EXECUTE sp_executesql @sql, 
        @ParameterDefinition, 
        @DestTable, 
        @PARMOUTP OUTPUT 

print @PARMOUTP; 
print isnull(@PARMOUTP, 'PARMOUTP is null!'); 

Qu'est-ce que je fais mal ici?

Cordialement,

Mike

+0

Quel SQL Server? Avez-vous essayé une autre base de données (peut-être certaines restrictions s'appliquent pour le courant)? Je ne peux pas reproduire le problème sur 2008 R2. – OzrenTkalcecKrznaric

+0

SQL Server 2008 Ozren –

Répondre

2

Votre requête ne convient pas pour sp_executesql avec un seul paramètre. Dans la requête, vous devez affecter une valeur à ce paramètre et l'exécuter. Quelque chose comme ceci:

create table TEMPTABLE 
(
    Id int identity primary key, 
    Name nvarchar(50) not null, 
); 
GO 

insert into TEMPTABLE(Name) values('Name 1'); 
GO 

DECLARE @PARMOUTP nvarchar(50) 
DECLARE @ParameterDefinition AS NVARCHAR(2000) 
DECLARE @DestTable VARCHAR(50) 
declare @sql nvarchar(max) 

    set @sql = 'SELECT @PARMOUTP = OBJECT_NAME(OBJECT_ID) AS TABLENAME 
       FROM  SYS.IDENTITY_COLUMNS 
       WHERE OBJECT_NAME(OBJECT_ID) = @DestTable' 

set @DestTable = 'TEMPTABLE' 

set @ParameterDefinition = '@DestTable VARCHAR(50), @PARMOUTP VARCHAR(50) OUTPUT' 


EXECUTE sp_executesql @sql, 
        @ParameterDefinition, 
        @DestTable, 
        @PARMOUTP OUTPUT 

print @PARMOUTP; 
print isnull(@PARMOUTP, 'PARMOUTP is null!'); 

Rappelez-vous que vous retournerez valeur scalaire de votre requête dynamique.

+0

Super !! A dû enlever «COMME TABLENAME» mais cela fonctionne. Merci à un million d'Ozren! –

1

Dans l'instruction SQL dynamique, vous n'êtes jamais attribuer une valeur au paramètre de sortie!

Vous sélectionnez le nom de la table en tant que jeu de résultats, mais il n'est jamais stocké dans la variable de sortie.

Essayez ceci:

set @sql = 'SELECT @PARMOUTP = OBJECT_NAME(OBJECT_ID) 
      FROM SYS.IDENTITY_COLUMNS 
      WHERE OBJECT_NAME(OBJECT_ID) = @DestTable' 
Questions connexes