7

Tôi có một thủ tục lưu trữ thực hiện một số SQL động. Tôi muốn sử dụng thủ tục lưu trữ này trong khung thực thể 4, nhưng khi tôi cố gắng tạo một kiểu phức tạp, thủ tục sẽ trả về không có cột nào. Có cách nào tôi có thể buộc nó trả lại giá trị của tôi và có được khung thực thể để nhận chúng không? Dưới đây là ví dụ đơn giản về những gì tôi muốn làm:Làm thế nào để trả về giá trị từ một thủ tục lưu trữ SQL động vào khung thực thể?

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 

Nhưng điều này không hiệu quả. Hãy giúp tôi ra. Về cơ bản, tôi muốn sử dụng một thủ tục lưu trữ để thực thi SQL động và trả về các giá trị cho khung thực thể.

+1

Tại sao bạn sử dụng SQL động cho điều này? – JonH

+0

Có phải chỉ để có một trường hợp demo đơn giản hay là câu lệnh động của bạn thực sự đơn giản như mô tả ở trên? Trong trường hợp này, bạn sẽ không cần SQL động. – Frank

+2

Vâng ... đây chỉ là ví dụ đơn giản .. Tôi đang làm một cái gì đó phức tạp .... đó là lý do tại sao sử dụng sql năng động ... tôi muốn sử dụng nó trong khung thực thể..và nhận giá trị .. – Vishal

Trả lời

16

Có lẽ bạn có thể xem xét SQL tham số, nếu bạn phải làm các truy vấn động:

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

Đó là cách tôi đã có nó mà không có giá trị vô hướng ... nhưng khung thực thể không phát hiện ra nó trả về bất kỳ cột nào .... – Vishal

+0

Sau đó, có lẽ bạn có thể đăng thêm một chút thông tin về lý do tại sao bạn cần thực hiện động. Thông thường có một cách để làm điều này mà không cần SQL động. – Anon246

+1

Tôi có nhiều mệnh đề ... được nối thêm vào lựa chọn chính ... khi tôi chuyển theo các tham số ... Vì vậy, sử dụng sql động để xây dựng những mệnh đề đó ... nhưng thực sự tất cả những gì tôi muốn biết là trả về giá trị một cách rõ ràng để ef4 nhận ra nó ... – Vishal

0

có bạn đã cố gắng đưa ra các bí danh để Chọn cuối cùng của bạn:

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

đã cố gắng..it ... không hoạt động ... – Vishal

0

Vâng, nếu EF có thể không nhận ra những gì bạn thủ tục lưu trữ phải trở về sau đó tạo kiểu phức tạp của bạn trước thời hạn. Bạn có thể tạo kiểu phức tạp bằng cách nhấp chuột phải vào bất kỳ vị trí nào trên mô hình và thêm loại phức tạp. Tiếp theo khi bạn nhập thủ tục được lưu trữ của mình, bạn có thể chọn loại phức tạp của mình từ trình đơn thả xuống.

4

thử này

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 

Hãy tin tôi. Điều đó là đủ.

Hoặc bạn có thể chỉ cần tạo loại phức tạp dựa trên kết quả truy vấn của bạn, sau đó sử dụng tập hợp loại phức hợp làm kết quả truy vấn của bạn.

+0

Cảm ơn tất cả những điều này là nhanh nhất và dễ dàng nhất. Cảm ơn một lần nữa. – coolcake

1

add dòng sau vào đầu SP

SET FMTONLY OFF 
1

Hãy thử kịch bản bên dưới này đang làm việc tốt.

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

tốt, tôi nghĩ rằng đây là những gì bạn đang tìm kiếm:

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 

này sẽ tạo ra một sp_calculatesalary_Result partial class nào trong khuôn khổ tổ chức DAL dựa.

Các vấn đề liên quan