7

Tengo un procedimiento almacenado que ejecuta algunos SQL dinámicos. Deseo utilizar este Procedimiento almacenado en el marco de entidades 4, pero cuando intento crear un tipo complejo, el procedimiento no devuelve columnas. ¿Hay alguna forma en que pueda obligarlo a devolver mis valores y obtener el marco de entidad para recibirlos? Aquí hay un ejemplo simplificado de lo que quiero hacer:¿Cómo devolver valores desde un Procedimiento almacenado de SQL dinámico al 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 

Pero esto no funciona. Por favor, ayúdame. Básicamente, quiero usar un Procedimiento almacenado para ejecutar SQL dinámico y devolver los valores al marco de la entidad.

+1

¿Por qué usa SQL dinámico para esto? – JonH

+0

¿Es solo para tener un caso de demostración simple, o su enunciado dinámico es tan simple como se describió anteriormente? En este caso, no necesitaría SQL dinámico. – Frank

+2

Bueno ... esto es solo un ejemplo simple ... Estoy haciendo algo complejo ... es por eso que usando SQL dinámico ... quiero usarlo en el marco de la entidad ... y obtener valores .. – Vishal

Respuesta

16

Tal vez usted podría considerar SQL parametrizada, si tiene que hacer consultas dinámicas:

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

Así es como lo tenía sin valores escalares ... pero el marco de entidades no detectó que devolviera ninguna columna ... – Vishal

+0

Entonces, quizás podría publicar un poco más de información sobre por qué necesita hacerlo de forma dinámica. Por lo general, hay una forma de hacerlo sin SQL dinámico. – Anon246

+1

Tengo múltiples cláusulas where ... que se anexan a la selección principal ... cuando paso de acuerdo con los parámetros ... Entonces, usando sql dinámico para compilar esas cláusulas where ... pero realmente todo lo que quiero saber es devolver valores explícitamente para que ef4 lo reconozca ... – Vishal

0

has necesitado dar alias a su última Seleccionar:

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

tried..it ... no funciona ... – Vishal

0

Bueno, si EF no puede reconocer lo que su El procedimiento almacenado debe regresar y luego crear su tipo complejo con anticipación. Puede crear un tipo complejo haciendo clic derecho en cualquier lugar del modelo y agregando un tipo complejo. A continuación, cuando importe su procedimiento almacenado, puede elegir su tipo complejo del menú desplegable.

4

probar esto

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 

créeme. Eso es suficiente.

O simplemente puede crear un tipo complejo basado en el resultado de su consulta, y luego usar la colección del tipo complejo como resultado de la consulta.

+0

Gracias de todos ellos era la más rápida y fácil. Gracias de nuevo. – coolcake

1

complemento siguiente línea al comienzo de su SP

SET FMTONLY OFF 
1

Prueba el siguiente script esto está funcionando 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 '[email protected] 

exec(@Result) 


ROLLBACK 
1

Bueno, creo que esto es lo que busca:

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 

esto generará una clase parcial sp_calculatesalary_Result pública en DAL basado marco de la entidad.

Cuestiones relacionadas