7

Ich habe eine Stored Procedure, die einige dynamische SQL ausführt. Ich möchte diese gespeicherte Prozedur in Entitätsframework 4 verwenden, aber wenn ich versuche, einen komplexen Typ zu erstellen, gibt die Prozedur keine Spalten zurück. Gibt es irgendeine Möglichkeit, dass ich es zwingen kann, meine Werte zurückzugeben und den Rahmen der Entität zu bekommen, um sie zu erhalten? Hier ist ein viel vereinfachtes Beispiel von dem, was ich tun möchte:Wie gibt man Werte aus einer dynamischen gespeicherten SQL-Prozedur an das Entity Framework zurück?

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 

Aber das funktioniert nicht. Bitte hilf mir. Grundsätzlich möchte ich eine Stored Procedure verwenden, um dynamisches SQL auszuführen und die Werte an das Entitätsframework zurückzugeben.

+1

Warum verwenden Sie dynamisches SQL dafür? – JonH

+0

Ist es nur eine einfache Demo-Fall, oder ist Ihre dynamische Aussage wirklich so einfach wie oben beschrieben? In diesem Fall benötigen Sie kein dynamisches SQL. – Frank

+2

Nun ... das ist nur ein einfaches Beispiel..Ich mache etwas komplexes ... deshalb benutze ich dynamisches sql ... ich möchte es im Entity Framework verwenden ... und Werte erhalten. – Vishal

Antwort

16

Vielleicht könnten Sie parametrisierte SQL betrachten, wenn Sie die dynamische Abfragen tun müssen:

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 [email protected]' 
    set @params='@empID int, @sal money OUTPUT, @usernm varchar(50) OUTPUT' 
    exec sp_executesql @dynsql, @params, @[email protected], @[email protected] OUTPUT, @usernm = @username OUTPUT 
    SELECT @salary, @username 
end 
+0

Das war, wie ich es ohne skalare Werte hatte ... aber Entity Framework erkannte nicht, dass es irgendwelche Spalten zurückgegeben .... – Vishal

+0

Dann könnten Sie vielleicht ein wenig mehr Informationen darüber, warum Sie es dynamisch tun müssen. Normalerweise gibt es eine Möglichkeit, dies ohne dynamisches SQL zu tun. – Anon246

+1

Ich habe mehrere Where-Klauseln ..., die an die Hauptauswahl angehängt werden ... wenn ich die entsprechenden Parameter überlasse ... Also benutze dynamic sql, um diese where-Klauseln zu erstellen ... aber wirklich alles, was ich wissen will, ist, Werte zurückzugeben explizit, so dass ef4 es erkennt ... – Vishal

0

haben Sie versucht, Aliase zur letzten Select geben:

select @Salary as Salary, @UserName as UserName 
+0

versucht..es ... funktioniert nicht ... – Vishal

0

Nun, wenn EF kann nicht erkennen, was Ihre Die gespeicherte Prozedur muss zurückkehren und dann Ihren komplexen Typ im Voraus erstellen. Sie können einen komplexen Typ erstellen, indem Sie mit der rechten Maustaste auf eine beliebige Stelle im Modell klicken und einen komplexen Typ hinzufügen. Weiter, wenn Sie Ihre gespeicherte Prozedur importieren, können Sie Ihren komplexen Typ aus dem Dropdown auswählen.

4

versuchen diese

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

glauben Sie mir. Das ist genug.

Oder Sie können einfach einen komplexen Typ basierend auf Ihrem Abfrageergebnis erstellen und dann die Sammlung des komplexen Typs als Abfrageergebnis verwenden.

+0

Danke von allen, das war das schnellste und einfachste. Danke noch einmal. – coolcake

1

add bei Beginn Ihrer SP folgende Zeile

SET FMTONLY OFF 
1

den unten stehenden Skript Versuchen Sie dies gut funktioniert.

BEGIN TRAN 

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

set @Column= 'CategoryName,CategoryID' 
set @Table='Category' 
set @Result= ' select ' + @Column + ' from '[email protected] 

exec(@Result) 


ROLLBACK 
1

gut, ich denke, das ist das, was Sie suchen:

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 

dies eine öffentliche Teilklasse sp_calculatesalary_Result in Entity Framework basiert DAL generieren.

Verwandte Themen