小编典典

MSSQL不使用sp_executesql传递用户定义的表类型

sql

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

阅读 179

收藏
2021-05-30

共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
2021-05-30