web-dev-qa-db-fra.com

Les types de retour pour les procédures stockées suivantes n'ont pas pu être détectés

En faisant glisser une procédure stockée dans un fichier dbml, j'obtiens cette erreur:

Type de retour inconnu
Les types de retour pour les procédures stockées suivantes n'ont pas pu être détectés. Définissez le type de retour pour chaque procédure stockée dans la fenêtre Propriétés.

Comment puis-je résoudre cette erreur?

27
sandeep

Ce problème se produit lorsque le concepteur ne peut pas déterminer le type de retour du SP.
Même problème et solutions décrites ici
Comment obtenir plusieurs résultats en utilisant LINQ to SQL

21
Shebin

Cela peut aussi être le problème des droits d'accès. Si la procédure stockée n'a pas d'accès à la table, vous obtenez la même erreur. J'avais une requête sélectionnant des données d'une autre base de données pour laquelle je ne détenais pas de droits (en fait, le compte exécutant la connexion à Visual Studio ne possédait pas les droits) et j'ai reçu la même erreur. Après avoir ajouté les droits appropriés, tout s'est bien passé. 

Essayer d'exécuter la procédure stockée dans VS2010 (en faisant un clic droit dans l'explorateur de serveurs et en sélectionnant "Exécuter") m'a aidé à résoudre le problème.

14
Ondrej Vencovsky

J'utilisais une table temporaire dans mon code SQL et j'obtenais cette erreur. J'ai converti la table temporaire en variables de table et cela a résolu mon problème.

12
Scott

Ajouter ces lignes juste après la déclaration des paramètres

AS
IF 1=0 BEGIN
 SET FMTONLY OFF
END

Ensuite, écrivezBEGINet démarrez votre travail de procédure.

12
Null Pointer

Je viens d'ajouter environ 300 procs stockés à mon DBML et j'ai rencontré beaucoup de problèmes notés ici et ailleurs. 

Voici un résumé des causes et des solutions de l'erreur "Les types de renvoi des procédures stockées suivantes n'ont pas pu être détectés", en fonction de ce que j'ai personnellement expérimenté. Notez que les problèmes décrits ci-dessous peuvent survenir dans le SP avec lequel vous rencontrez l'erreur ou dans tout autre SP appelé directement ou indirectement depuis ce SP.  

  • Concaténer des entiers avec une chaîne en utilisant un symbole '+'. Utilisez CAST () sur les entiers ou, dans SQL2012 ou supérieur, utilisez l'instruction CONCAT ().
  • Référencement de tables dans d'autres bases de données. Apparemment, un problème d'autorisations. Je n'ai pas pu résoudre celui-ci.
  • Tout appel direct ou indirect à XP_CMDSHELL. Je n'ai pas pu résoudre celui-ci.
  • Toute erreur de syntaxe dans les appels directs ou indirects à d’autres processus stockés. Correction de l'appel vers le SP.
  • Tables de temp. Remplacez la table temporaire par une variable de table.
  • SET QUOTED_IDENTIFIER OFF est en cours d'utilisation, mais la table en cours d'édition comporte une vue indexée. * Modifiez l'instruction set en SET QUOTED_IDENTIFIER ON. *
8
Mike

Raison: votre procédure stockée renverra un type complexe. c'est-à-dire plusieurs résultats ou utilise une table temporaire.

Résolution

Cela dépend entièrement de ce que fait votre procédure stockée. Liens utiles

  1. http://odetocode.com/code/365.aspx
  2. http://riteshkk2000.blogspot.com/2010/08/error-unknown-return-type-return-types.html
8
naveen

Juste au cas où quelqu'un d'autre tomberait sur ça, je viens de le vivre moi-même.

Dans mon cas, je faisais référence à une table dans une instruction insert qui n'existait plus dans mon schéma. Une inspection plus minutieuse de mon code a révélé que je m'inscrivais dans une table appelée "Compte" qui s'appelle maintenant "tblAccount". Visual Studio n'a généré aucune erreur lors de l'enregistrement du sp, mais j'ai rencontré la même erreur en essayant d'ajouter le sp au fichier dbml.

J'espère que cela aidera quelqu'un d'autre.

7
darth_phoenixx

J'ai également eu le problème (VS 2012, SQL Server 2008R2). Dans mon cas, il s'agissait d'une combinaison de l'opérateur + et de diverses instructions CAST dans le code. Je n'ai pas trouvé de moyen de les remplacer par quelque chose que VisualStudio aime, mais j'ai trouvé une solution de contournement:

Solution de contournement "Dummy SELECT"

  • Créez une instruction SELECT factice avec tous les champs à renvoyer. Par exemple:
    select 'bla bla' as field1, 123123 as field2, 'asñfs' as field3
  • Mettez en commentaire votre code SP et laissez le sélecteur factice SELECT dans votre SP.
  • Ajoutez votre SP dans le concepteur O/R et sauvegardez-le (il devrait le savoir sans message d'erreur)
  • Restaurez votre SP d'origine (laissez le SELECT fictif en tant que commentaire pour une utilisation ultérieure)
5
Daniel Hillebrand

J'ai également eu ce problème - je devais commenter le code qui construisait un polygone:

declare
    @MapBounds geography
    ;

select
    @MapBounds = geography::STGeomFromText('POLYGON((' + 
        cast(@NorthEastLng as varchar) + ' ' + cast(@NorthEastLat as varchar) + ', ' +  
        cast(@SouthWestLng as varchar) + ' ' + cast(@NorthEastLat as varchar) + ', ' +  
        cast(@SouthWestLng as varchar) + ' ' + cast(@SouthWestLat as varchar) + ', ' +  
        cast(@NorthEastLng as varchar) + ' ' + cast(@SouthWestLat as varchar) + ', ' + 
        cast(@NorthEastLng as varchar) + ' ' + cast(@NorthEastLat as varchar) + 
        '))', 4326)
    ;

Une fois ajouté au dmbl, je n'ai pas commenté le code et cela a fonctionné comme un champion!

5
azcoastal

Vous pouvez aussi bien utiliser la méthode CONCAT () au lieu de '+' pour concaténer une chaîne. Depuis que je n'utilisais pas de table temporaire et que je rencontrais toujours ce problème. J'ai découvert que concaténer des chaînes en utilisant '+' déclenche cela.

Dans mon cas, j'utilisais ceci:

SET @errorMessage = CONCAT('Update (ID=', @pnID, ') failed. Name already exists.');

Au lieu de:

SET @errorMessage = 'Update (ID=' + @pnID + ') failed. Name already exists.';
3
Yusup

J'ai beaucoup lutté à ce sujet et je suis parvenu à la conclusion que si votre procédure stockée est dynamique et qu'elle est combinée avec des chaînes, il vous manque parfois quelque chose. Le type reste indéfini. Une fois que vous avez corrigé la procédure (les chaînes de requête que vous construisez pour l'exécution), vous pouvez ajouter la procédure sans aucun problème.

0
m4ngl3r

La solution que j'ai trouvée ... Je place un SELECT au dessus (IF) avec des conditions incorrectes et crée une table de variables avec le résultat qu'il veut quitter, puis "ELSE" règle le problème. La première partie est uniquement si vous comprenez le résultat du processus que je veux. Regarde mon exemple

ALTER PROCEDURE [dbo].[SS_getSearchedProductsDetailsNew]
(
 @mk int,
 @md int,
 @yr int = 0,
 @caroption int = 0,
 @condition int = 0,
 @producttype int = 0 ,
 @option int = 0, 
 @coloroption int = 0
)
AS

declare @sql nvarchar(max)

Begin
  if  @mk = 0 and @md = 0 and @yr = 0
    begin
        Declare @TempTable2 TABLE(
            ProductID numeric(10),
            TypeName nvarchar(50),
            MakeID numeric(10),
            ModelID numeric(10),
            ConditionID numeric(10),
            CarOptionsID numeric(10),
            OptionsID numeric(10),
            ColorOptionsID numeric(10),
            Make nvarchar(50),
            Model nvarchar(50),
            YearID numeric(5),
            Color  nvarchar(50),
            ProductType nvarchar(50),
            CarOptionName nvarchar(50),
            OptionName nvarchar(50),
            ColorOptionName nvarchar(50),
            ConditionName nvarchar(50),
            Notes  nvarchar(500),
            Price money,
            cog money)

            select * from @TempTable2

    end 

   else
   begin


  select @sql = '
    declare @theNotes  nvarchar(500)
    declare @theMake numeric(10), @theModel numeric(10), @theYear numeric(10)
    declare @makeName nvarchar(50), @modelName nvarchar(50), @ID numeric(5)
    declare @theProductType nvarchar(50), @theTypeName nvarchar(50)
    declare @theColor nvarchar(50),@theProductID numeric(10)
    declare @theCondition numeric(10),@theCarOption numeric(10) , @theOption numeric(10), @theColorOption numeric(10)
    declare @theConditionName nvarchar(50),@theCarOptionName nvarchar(50), @theOptionName nvarchar(50),@theColorOptionName nvarchar(50)
    declare @thePrice money, @theCog money


    declare @HoldingTable table(
        ID numeric identity,
        ProductID numeric(10),
        MakeID numeric(10),
        ModelID numeric(10),
        ConditionID numeric(10),
        CarOptionsID numeric(10),
        OptionsID numeric(10),
        ColorOptionsID numeric(10),
        Make nvarchar(50),
        Model nvarchar(50),
        YearID numeric(5),
        Color  nvarchar(50),
        ProductType nvarchar(50),
        Notes  nvarchar(500),
        Price money,
        cog money);

        INSERT INTO @HoldingTable (ProductID,MakeID, ModelID , ConditionID, CarOptionsID,OptionsID,ColorOptionsID, Make ,Model,YearID,Color,    ProductType, Notes, Price, cog) 
        SELECT   
            ProductNumber as ProductID,
            tblProductsForSale.MakeID as MakeID,
            tblProductsForSale.ModelID as ModelID ,
            ConditionID,
            CarOptionsID,
            OptionsID,
            ColorOptionsID,
            tblVehicleMake.Make as Make ,
            tblVehicleModel.Model as Model,
            YearID,
            Color,
            ProductType, Notes,
            tblProductsForSale.ResalePrice as Price,
            tblProductsForSale.SellPrice as cog
                from    tblProductsForSale, tblVehicleMake, tblVehicleModel where 
                tblProductsForSale.MakeID = tblVehicleMake.MakeID and  
                tblProductsForSale.ModelID = tblVehicleModel.ModelID 
                and tblProductsForSale.ProductStatus=''available'' and tblProductsForSale.Custom=0'

        if(@mk > 0)
        begin       
            select @sql = @sql + ' and tblProductsForSale.MakeID = ' + convert(varchar, @mk)
        end
        if @md > 0
        Begin
            select @sql = @sql + ' and tblProductsForSale.ModelID = ' + convert(varchar, @md)
        End
        if @yr > 0
        begin
            select @sql = @sql + ' and tblProductsForSale.YearID = ' + convert(varchar, @yr)            
        end
        if @caroption > 0
        begin
            select @sql = @sql + ' and tblProductsForSale.CarOptionsID = ' + convert(varchar, @caroption)
        end 
        if @producttype > 0
        begin
            select @sql = @sql + ' and tblProductsForSale.ProductType = ''' + convert(varchar,@producttype)  + ''''
        end 
        if @option > 0
        begin
            select @sql = @sql + ' and tblProductsForSale.OptionsID = ' + convert(varchar, @option)
        end 
        if @coloroption > 0
        begin
            select @sql = @sql + ' and tblProductsForSale.ColorOptionsID = ' + convert(varchar, @coloroption)
        end     

        --select @sqlInsert = 'INSERT INTO @HoldingTable (ProductID,MakeID, ModelID , ConditionID, CarOptionsID,OptionsID,ColorOptionsID, Make ,Model,YearID,Color, ProductType, Price, cog) '
        --select @sqlExec = @sqlInsert + @sql


        --select * from @HoldingTable
        select @sql = @sql + 'Declare @TempTable2 TABLE(
            ProductID numeric(10),
            TypeName nvarchar(50),
            MakeID numeric(10),
            ModelID numeric(10),
            ConditionID numeric(10),
            CarOptionsID numeric(10),
            OptionsID numeric(10),
            ColorOptionsID numeric(10),
            Make nvarchar(50),
            Model nvarchar(50),
            YearID numeric(5),
            Color  nvarchar(50),
            ProductType nvarchar(50),
            CarOptionName nvarchar(50),
            OptionName nvarchar(50),
            ColorOptionName nvarchar(50),
            ConditionName nvarchar(50),
            Notes  nvarchar(500),
            Price money,
            cog money)

        WHILE Exists(Select * from @HoldingTable )
            begin
                Select @ID = ID FROM @HoldingTable 
                Select @theProductId = ProductID from @HoldingTable
                Select @theMake = MakeID  from @HoldingTable
                Select @theModel = ModelID  from @HoldingTable
                Select @theCondition = ConditionID  from @HoldingTable
                Select @theCarOption = CarOptionsID  from @HoldingTable
                Select @theOption = OptionsID  from @HoldingTable
                Select @theColorOption = ColorOptionsID  from @HoldingTable
                Select @theYear = YearID from @HoldingTable
                Select @theColor = Color from @HoldingTable
                Select @theProductType = ProductType from @HoldingTable
                Select @theTypeName = TypeName from tblProductType WHere ProductTypeID = cast (@theProductType as numeric(10))

                Select @thePrice = Price from @HoldingTable
                Select @theCog = cog from @HoldingTable

                Select @theConditionName = ConditionName from tblConditions Where ConditionID = @theCondition
                Select @makeName = Make from tblVehicleMake Where MakeID = @theMake
                Select @modelName = Model from tblVehicleModel Where ModelID = @theModel
                Select @theCarOptionName = CarOptionsName from tblCarOptions Where CarOptionsID = @theCarOption
                Select @theOptionName = OptionsName from tblOptions Where OptionsID = @theOption
                Select @theColorOptionName = ColorOptionsName from tblColorOptions Where ColorOptionsID = @theColorOption

                Select @theNotes = Notes from @HoldingTable
                Select @theProductType = ProductType from @HoldingTable

                INSERT INTO @TempTable2  (ProductID,TypeName,MakeID,ModelID,ConditionID ,CarOptionsID,OptionsID ,ColorOptionsID ,Make , Model , YearID ,Color,   ProductType, CarOptionName ,OptionName,ColorOptionName ,ConditionName, Notes, Price, cog)
                VALUES (@theProductId,@theTypeName, @theMake, @theModel, @theCondition, @theCarOption,@theOption,@theColorOption, @makeName,@modelName, @theYear, @theColor,@theProductType, @theCarOptionName, @theOptionName, @theColorOptionName, @theConditionName, @theNotes,  @thePrice , @theCog )
                DELETE FROM @HoldingTable  Where ID = @ID
            end

            Select * from @TempTable2 order by ProductID '


            end
            exec ( @sql )

    End
0
Julio Mecias