MsSQL没有使用sp_executesql传递用户定义的表类型

时间:2017-10-24 10:38:59

标签: sql sql-server user-defined-types

我正在尝试将用户定义的表类型传递给存储过程(最初使用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

第二个查询由Entity Framework使用,所以我需要它才能工作。你能告诉我它有什么问题吗?我和几位导游检查了如何做到这一点,我发现这里没有错。

我尝试将类型更改为字符串(VARCHAR(100)),但结果是相同的。我在SQL Server 2016上运行它,但在dev(托管)机器上也是如此,这是2014版本。

感谢您的帮助。

马丁

编辑 - 解决方案@sepupic:

如果你受到像我这样的Pass table value type to SQL Server stored procedure via Entity Framework的启发,请确保你传递参数(!),如:

context.Database.ExecuteSqlCommand("[dbo].[MyProcedure] @bookEntryIds", parameter);

1 个答案:

答案 0 :(得分:1)

-- 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