Comment renvoyer les valeurs D'une procédure SQL stockée dynamique vers le Framework Entity?

j'ai une procédure stockée qui exécute du SQL dynamique. Je veux utiliser cette Procédure Stockée dans entity framework 4, mais lorsque j'essaie de créer un type complexe la procédure retourne pas de colonnes. Y a-t-il un moyen de le forcer à retourner mes valeurs et de faire en sorte que le cadre de l'entité les reçoive? Voici un exemple simplifié de ce que je veux faire:

CREATE PROCEDURE sp_calculatesalary(@EmployeeId as int)
begin
    declare dynsql as varachar(500)
    @dynsql='Select @Salary=Salary,@UserName=Username from employee
            where EmployeeId='+cast(@EmployeeId as varchar)+ ''
    exec(@dynsql)
    select @Salary, @UserName
end

Mais cela ne fonctionne pas. Merci de m'aider. Fondamentalement, je veux utiliser une Procédure Stockée exécutez le SQL dynamique et retournez les valeurs au framework entity.

7
demandé sur gkrogers 2010-07-02 19:11:17

7 réponses

peut-être pourriez-vous considérer le SQL paramétré, si vous devez faire des requêtes dynamiques:

CREATE PROCEDURE sp_calculatesalary(@EmployeeId as int)  
as 
begin   
    declare @dynsql varchar(500)   
    declare @params nvarchar(500)
    declare @salary money
    declare @username varchar(50)
    set @dynsql='Select @sal=Salary,@usernm=Username from employee where EmployeeId=@empID'   
    set @params='@empID int, @sal money OUTPUT, @usernm varchar(50) OUTPUT'
    exec sp_executesql @dynsql, @params, @empID=@EmployeeID, @sal=@salary OUTPUT, @usernm = @username OUTPUT
    SELECT @salary, @username
end
16
répondu Anon246 2015-02-27 00:17:23

essayez cette

CREATE PROCEDURE sp_calculatesalary(@EmployeeId as int)   
AS
   DECLARE @dynsql VARCHAR(500)=' Salary,Username FROM employee WHERE EmployeeId=@empID'    
   EXEC sp_executesql @dynsql,'@empID INT',@empID=@EmployeeID
   SELECT 1 AS salary,2 AS username

croyez-moi. C'en est assez.

ou vous pouvez simplement créer un type complexe basé sur le résultat de votre requête , puis utiliser la collection du type complexe comme résultat de votre requête.

4
répondu Mohsen 2016-09-26 14:27:17

ajouter la ligne suivante au début de votre PS

SET FMTONLY OFF
1
répondu Nitin Sawant 2012-09-25 08:48:16

essayez le script ci-dessous cela fonctionne bien.

BEGIN TRAN

DECLARE @Result varchar(max),@Table varchar(max),@Column varchar(max)

set @Column= 'CategoryName,CategoryID'
set @Table='Category'
set @Result= ' select ' + @Column + ' from '+@Table

exec(@Result)


ROLLBACK
1
répondu RickyRam 2014-05-21 08:26:44

Eh bien, je pense que c'est ce que vous cherchez:

create procedure sp_calculatesalary
    @employeeId int
as
    declare @sql nvarchar(max);
    @sql='select salary, username from employee
            where employeeId=' + cast(@employeeId as nvarchar(10));

    declare @t table (salary float, username varchar(50));
    insert into @t exec(@sql);

    select salary, username from @t;
return

cela générera une classe publique partielle sp_calculatesalary_Result dans le dal basé sur le framework entity.

1
répondu Opochitsky Dimitry 2016-10-16 17:49:42

avez-vous essayé de donner des alias à votre dernier Select:

select @Salary as Salary, @UserName as UserName
0
répondu Moose 2010-07-02 15:24:44

bien, si EF ne peut pas reconnaître ce que votre procédure stockée doit retourner alors créer votre type complexe à l'avance. Vous pouvez créer un type complexe par un clic droit n'importe où sur le modèle et et ajouter un type complexe. Ensuite, lorsque vous importez votre procédure stockée, vous pouvez choisir votre type complexe à partir de la liste déroulante.

0
répondu zeeshanhirani 2010-07-08 05:11:30