我在互联网上搜索过,发现了类似的帖子。但是,没有解决方案适合我。
我遇到了一个存储过程问题。在Visual Studio中将它添加到我的项目时,我收到以下消息:
选定的存储过程或函数不返回任何列。
之前我可以通过在我的程序中添加SET FMTONLY OFF
来解决问题(已解答here)。现在这不会改变任何事情;根据EF,它仍然没有返回任何列。
我的存储过程如下所示:
ALTER PROCEDURE [dbo].[spImportData]
@someParameter
AS
BEGIN
SET NOCOUNT ON;
-- Some insertion
INSERT INTO dbo.SomeTable ([SomeField])
SELECT @someParameter
SELECT CAST(SCOPE_IDENTITY() AS BIGINT) AS ImportId
END
使用临时表时结果相同:
CREATE TABLE #temp (ImportId BIGINT)
INSERT INTO #temp (ImportId)
SELECT CAST(SCOPE_IDENTITY() AS BIGINT)
SELECT ImportId FROM #temp
DROP TABLE #temp
仍然没有包含表变量的列:
DECLARE @importId BIGINT = SELECT CAST(SCOPE_IDENTITY() AS BIGINT)
SELECT @importId
直接在SQL Server中执行过程时,我得到了所需的值。
我错过了什么?我认为SET FMTONLY OFF
可以做到这一点但在这种情况下没有任何变化,我的程序仍然“不返回任何列”。
修改1
我尝试了@NEER在评论中提出的建议。我将SELECT
更改为SELECT 1 AS ImportId
。但我仍然得到同样的信息。
答案 0 :(得分:0)
我发现了这个问题。我在声明上方的存储过程和的内部块上添加了SET FMTONLY OFF
,因为其中一个单独不起作用。两者都没有在一起...所以我删除了块内的那个并再次尝试了令人惊讶的工作方式。
我的存储过程现在看起来像这样:
SET FMTONLY OFF
GO
ALTER PROCEDURE [dbo].[spImportData]
@someParameter
AS
BEGIN
-- SET FMTONLY OFF; -> I removed this line
SET NOCOUNT ON;
-- Some insertion
INSERT INTO dbo.SomeTable ([SomeField])
SELECT @someParameter
SELECT CAST(SCOPE_IDENTITY() AS BIGINT) AS ImportId
END