Как вернуть значения из динамической хранимой процедуры SQL в Entity Framework? - PullRequest
7 голосов
/ 02 июля 2010

У меня есть хранимая процедура, которая выполняет динамический SQL.Я хочу использовать эту хранимую процедуру в платформе сущностей 4, но когда я пытаюсь создать сложный тип, процедура не возвращает столбцы.Есть ли способ заставить его вернуть мои значения и заставить структуру сущностей получить их?Вот очень упрощенный пример того, что я хочу сделать:

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

Но это не работает.Пожалуйста, помогите мне.По сути, я хочу использовать хранимую процедуру для выполнения динамического SQL и возврата значений в структуру сущностей.

Ответы [ 7 ]

16 голосов
/ 02 июля 2010

Возможно, вы могли бы рассмотреть параметризованный SQL, если вам нужно выполнять динамические запросы:

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
4 голосов
/ 13 августа 2011

попробуйте

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

Поверь мне. Этого достаточно.

Или вы можете просто создать сложный тип на основе результата запроса, а затем использовать коллекцию сложного типа в качестве результата запроса.

1 голос
/ 16 октября 2016

хорошо, я думаю, это то, что вы ищете:

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

это сгенерирует публичный частичный класс sp_calculatesalary_Result в DAL на основе структуры сущности.

1 голос
/ 21 мая 2014

Попробуйте приведенный ниже скрипт, он работает хорошо.

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 голос
/ 25 сентября 2012

добавить следующую строку в начале вашего SP

SET FMTONLY OFF
0 голосов
/ 06 июля 2010

Хорошо, если EF не может распознать, что должна вернуть ваша хранимая процедура, создайте свой сложный тип заранее. Вы можете создать сложный тип, щелкнув правой кнопкой мыши в любом месте модели и добавив сложный тип. Затем, когда вы импортируете хранимую процедуру, вы можете выбрать комплексный тип из выпадающего списка.

0 голосов
/ 02 июля 2010

пытались ли вы дать псевдонимы своему последнему выбору:

select @Salary as Salary, @UserName as UserName
...