7

Mam procedurę składowaną, która wykonuje niektóre dynamiczne SQL. Chcę użyć tej procedury składowanej w strukturze encji 4, ale gdy próbuję utworzyć typ złożony, procedura zwraca kolumny. Czy istnieje sposób, w jaki mogę zmusić go do zwrócenia moich wartości i uzyskania struktury encji, aby je otrzymać? Oto bardzo uproszczony przykład tego, co chcę zrobić:Jak zwrócić wartości z dynamicznej procedury składowanej SQL do Entity Framework?

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 

Ale to nie działa. Proszę pomóż mi. Zasadniczo chcę użyć procedury składowanej do wykonania dynamicznego SQL i zwrócić wartości do struktury encji.

+1

Dlaczego używasz do tego dynamicznego SQL? – JonH

+0

Czy to po prostu prosty przypadek demo, czy też dynamiczne stwierdzenie jest tak proste, jak opisano powyżej? W takim przypadku nie potrzebujesz dynamicznego SQL. – Frank

+2

No cóż ... to tylko prosty przykład ... Robię coś skomplikowanego ... dlatego używanie dynamicznego sql ... chcę go użyć w strukturze encji ... i uzyskać wartości .. – Vishal

Odpowiedz

16

Może rozważyć parametryczne SQL, jeśli trzeba zrobić dynamiczne zapytania:

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

Tak właśnie miałem bez wartości skalarnych ... ale framework encji nie wykrył, że zwrócił kolumny ... – Vishal

+0

W takim razie możesz opublikować trochę więcej informacji o tym, dlaczego musisz robić to dynamicznie. Zwykle istnieje sposób, aby to zrobić bez dynamicznego SQL. – Anon246

+1

Mam wiele klauzul where, które są dołączane do głównego wyboru ... kiedy przekazuję odpowiednie parametry ... Więc używając dynamicznego sql do budowania tych klauzul, gdzie ... ale tak naprawdę wszystko, co chcę wiedzieć, to zwrócenie wartości jawnie, aby ef4 ją rozpoznał ... – Vishal

0

próbowałeś dając aliasów do ostatniego Wybierz:

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

próbował ... to ... nie działa ... – Vishal

0

Cóż, jeżeli EF nie może rozpoznać, co się procedura składowana musi powrócić, a następnie utworzyć złożony typ z wyprzedzeniem. Można utworzyć typ złożony, klikając prawym przyciskiem myszy dowolne miejsce na modelu i dodać typ złożony. Następnie, po zaimportowaniu procedury składowanej, można wybrać typ złożony z menu rozwijanego.

4

spróbować

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 

Uwierz mi. To wystarczy.

Można też po prostu utworzyć typ złożony na podstawie wyniku zapytania, a następnie użyć kolekcji złożonego typu jako wyniku zapytania.

+0

Dzięki wszystkim był to najszybszy i najłatwiejszy. Dzięki jeszcze raz. – coolcake

1

Dodaj następujący wiersz na początku swojej SP

SET FMTONLY OFF 
1

Wypróbuj poniższy skrypt ten działa dobrze.

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

dobrze, myślę, że to jest to, czego szukasz:

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 

ten wygeneruje publicznych częściowej klasy sp_calculatesalary_Result w DAL oparte Entity Framework.

Powiązane problemy