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 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
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.
ajouter la ligne suivante au début de votre PS
SET FMTONLY OFF
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
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.
avez-vous essayé de donner des alias à votre dernier Select:
select @Salary as Salary, @UserName as UserName
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.