我有一个动态生成自己的存储过程,详细地说我要添加到where,order by子句动态。
这是我的存储过程:
ALTER PROCEDURE [dbo].[sp_GetConsultants]
@SearchQuery VARCHAR(MAX) = NULL,
@SortDataField VARCHAR(100),
@SortOrder VARCHAR(4),
@PageNum INT,
@PageSize INT,
@sql NVARCHAR(MAX) = NULL OUTPUT
AS
BEGIN
SET @sql = N'
WITH cte AS
(
SELECT
ID, [NO], Firstname, Lastname, ReferanceID,
CAST('''' AS VARCHAR(MAX)) AS ReferanceNO
FROM
dbo.Consultants
WHERE
ReferanceID IS NULL
UNION ALL
SELECT
c.ID, c.[NO], c.Firstname, c.Lastname, c.ReferanceID,
CASE
WHEN ct.ReferanceNO = ''''
THEN CAST(ct.[NO] AS VARCHAR(MAX))
ELSE CAST(ct.[NO] AS VARCHAR(MAX))
END
FROM
dbo.Consultants c
INNER JOIN
cte ct ON ct.ID = c.ReferanceID
)
SELECT *
FROM cte '
+ @SearchQuery
+ ' ORDER BY '
+ @SortDataField + ' ' + @SortOrder
+ ' OFFSET '+ CAST(@PageNum AS VARCHAR(20)) + ' ROW FETCH NEXT ' +CAST(@PageSize AS VARCHAR(20)) + ' ROWS ONLY'
EXEC sp_executesql @sql, N'@SearchQuery VARCHAR(MAX), @SortDataField VARCHAR(100), @SortOrder VARCHAR(4), @PageNum INT, @PageSize INT', @SearchQuery, @SortDataField, @SortOrder, @PageNum, @PageSize
END
我正在尝试将此存储过程添加到Entity Framework,但没有成功。实体框架无法为我的存储过程创建复杂类型,我点击"获取列信息"按钮,但下面的文本框显示"所选的存储过程不返回任何列"。
你知道这是什么问题吗?
P.S。如果我从@sql
字符串
答案 0 :(得分:2)
可能是因为您的过程中没有正确的SQL语句,Entity Framework可以通过该语句检测结果列。
解决方法是,在过程结束时放置一个SQL Select语句,该语句应该告诉Entity Framework有关结果的信息,例如在过程结束时放下以下语句并更新它
SELECT
CAST(1 AS int) AS ID
,CAST(1 AS int) AS [NO]
,N'Fist Name' AS Firstname
,N'Lasat Name' AS Lastname
,CAST(1 AS int) AS ReferanceID
,CAST('' AS VARCHAR(MAX)) AS ReferanceNO
在此之后,进入实体框架并导入该过程,它应该正确显示列。在Entity Framework中导入SP后,返回Procedure并注释掉我们刚添加的最后一个SELECT
语句。最后一条声明仅适用于实体框架,以了解SP将返回的内容。
P.S。我不确切知道列类型,因此您应该更好地更改select
语句中的列类型