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?
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
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.
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.
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.
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.
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
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.
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" :
select 'bla bla' as field1, 123123 as field2, 'asñfs' as field3
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!
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.';
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.
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