我正在尝试将我的用户定义表类型传递给存储过程(最初使用EF)。但是,我被困住了,因为看起来sp_executesql将参数传递给存储过程,但它为空。检查一下,这是类型:
CREATE TYPE [dbo].[BigIntList] AS TABLE( [Item] [bigint] NULL )
这是存储过程:
CREATE PROCEDURE [dbo].[MyProcedure] @bookEntryIds [dbo].[BigIntList] READONLY AS BEGIN SET NOCOUNT ON; SELECT * FROM @bookEntryIds END
这就是困扰我的地方:
DECLARE @bookEntryIds [dbo].[BigIntList] INSERT INTO @bookEntryIds VALUES (50181) INSERT INTO @bookEntryIds VALUES (40182) -- 1. This returns 50181 and 40182 EXEC [dbo].[MyProcedure] @bookEntryIds -- 2. This returns empty result with column "Item" EXEC sp_executesql N'[dbo].[MyProcedure]', N'@bookEntryIds [dbo].[BigIntList] READONLY', @bookEntryIds
第二个查询由实体框架使用,因此我需要它来工作。你能告诉我这是怎么回事吗?我检查了一些指南,以了解如何执行此操作,但在这里我没有发现任何错误。
我尝试将类型更改为字符串(VARCHAR(100)),但结果是相同的。我在SQL Server 2016上运行它,但在2014年版本的开发(托管)计算机上也发生了同样的情况。
感谢帮助。
马丁
编辑-@sepupic解决方案:
如果您受到像我这样通过Entity Framework将表值类型传递到SQL Server存储过程的启发,请确保您正在传递参数(!),例如:
context.Database.ExecuteSqlCommand("[dbo].[MyProcedure] @bookEntryIds", parameter);
-- 2. This returns empty result with column "Item" EXEC sp_executesql N'[dbo].[MyProcedure]', N'@bookEntryIds [dbo].[BigIntList] READONLY’, @bookEntryIds
-- 2. This returns empty result with column "Item" EXEC sp_executesql N'[dbo].[MyProcedure]', N'@bookEntryIds
[dbo].[BigIntList] READONLY’, @bookEntryIds
结果为空,因为您忘记了传递参数,它看起来应该像这样:
EXEC sp_executesql N'[dbo].[MyProcedure] @bookEntryIds = @bookEntryIds', N'@bookEntryIds [dbo].[BigIntList] READONLY', @bookEntryIds