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

Posted

技术标签:

【中文标题】MsSQL 未使用 sp_executesql 传递用户定义的表类型【英文标题】:MsSQL not passing user defined table type using sp_executesql 【发布时间】:2017-10-24 10:38:58 【问题描述】:

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

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

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

【问题讨论】:

【参考方案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

【讨论】:

为了最大限度地提高 @bookEntryIds 的优点,声明的完整形式将是 EXEC sp_executesql N'EXEC [dbo].[MyProcedure] @bookEntryIds = @bookEntryIds', N'@bookEntryIds [dbo].[BigIntList] READONLY', @bookEntryIds = @bookEntryIds。这也清楚地表明我们以非常迂回的方式调用存储过程,作为动态EXEC SQL 语句。直接 RPC 调用会不间接地传递参数,但我不知道 EF 是否对此有直接支持。 非常感谢。现在我真的觉得自己很傻。我可能错过了它,因为我受到***.com/questions/33772886/… 的启发,它也不见了。再次感谢。

以上是关于MsSQL 未使用 sp_executesql 传递用户定义的表类型的主要内容,如果未能解决你的问题,请参考以下文章

Sql语句拼接(EXEC和sp_executesql的区别)

SqlserverT-SQL中EXEC 与 SP_EXECUTESQL的 区别

存储过程中执行动态Sql语句

怎样SQL存储过程中执行动态SQL语句

mysql中的prepare介绍和应用

delphi MSSQL表类型传参