存储过程不返回任何列,仅返回整数

萨利姆

我导入存储过程时,ententi框架6.0.0.0出现问题,无论我做什么,它都不会返回结果集,而是仅返回整数或设置为none。下面是sp。

alter proc spGetProd
@Prod nvarchar(500)
as
begin
SET FMTONLY OFF
IF OBJECT_ID('tempdb..##PRODUCTTABLE') IS NOT NULL DROP TABLE ##PRODUCTTABLE
DECLARE @MYQUERY nvarchar(MAX), @my_Div nvarchar(500);
set @my_Div = REPLACE(@Prod, ',', ''',''');

SET @MYQUERY = 'SELECT DISTINCT [GNo],[GName]    
into ##PRODUCTTABLE FROM ABC
where Div IN ('''+@my_Div+''') 
order by GNo'

EXEC (@MYQUERY)
SELECT GNo, GName FROM ##PRODUCTTABLE;
drop table  ##PRODUCTTABLE;
end

不管我做什么,不管我做什么,都不要做SET FMTONLY OFF / ON我做了很久,它只工作了一次,当我设置SET FMTONLY OFF然后将其删除时,它适用于该sp,但不适用于其他存储过程。即使我从select * from ##PRODUCTTABLE;上面获得结果集或指定类似上面的列。这是我在MVC中的操作。

public JsonResult GetData()
        {
         var allProducts = gentity.spGetProd("AB"); //return type shows as int.
         return Json(allProducts, JsonRequestBehavior.AllowGet);
       }

还有其他解决方法吗,因为我的应用程序主要依赖于存储过程,这些存储过程通常从上述临时表中返回数据。

伊戈尔·米切夫(Igor Micev)

问题出在您的存储过程中。您的问题非常简单,并且使事情变得复杂。

只需在您的数据库中创建此函数即可。

CREATE FUNCTION dbo.SplitStrings
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN 
   (  
      SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(@List, @Delimiter, '</i><i>') 
          + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
   );
GO

现在您的存储过程应该看起来像

ALTER PROC spGetProd
    @Prod nvarchar(500)
AS
BEGIN
 SET NOCOUNT ON;
 SELECT DISTINCT [GNo],[GName]    
 FROM ABC
 WHERE Div IN (SELECT Item FROM dbo.SplitStrings(@Prod,','))
 ORDER BY GNo;
END

没有临时表,没有额外的变量,没有EXEC,没有对象丢失。只需为您的EF一个明确的选择语句即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章