MsSQL 未使用 sp_executesql 传递用户定义的 table 类型
MsSQL not passing user defined table type using sp_executesql
我正在尝试将我的用户定义 Table 类型传递给存储过程(最初使用 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 服务器 2016 上,但同样发生在开发(托管)机器上,那里是 2014 版本。
感谢您的帮助。
马丁
编辑 - @sepupic 的解决方案:
如果您像我一样受到 的启发,请确保您正在传递参数 (!),例如:
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
结果为空,因为你忘记传入参数了,应该是这样的:
EXEC sp_executesql N'[dbo].[MyProcedure] @bookEntryIds = @bookEntryIds', N'@bookEntryIds [dbo].[BigIntList] READONLY', @bookEntryIds
我正在尝试将我的用户定义 Table 类型传递给存储过程(最初使用 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 服务器 2016 上,但同样发生在开发(托管)机器上,那里是 2014 版本。
感谢您的帮助。
马丁
编辑 - @sepupic 的解决方案:
如果您像我一样受到
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
结果为空,因为你忘记传入参数了,应该是这样的:
EXEC sp_executesql N'[dbo].[MyProcedure] @bookEntryIds = @bookEntryIds', N'@bookEntryIds [dbo].[BigIntList] READONLY', @bookEntryIds