MSSQL不使用sp_executesql传递用户定义的表类型
技术问答
263 人阅读
|
0 人回复
|
2023-09-12
|
我试图将我的用户定义表类型传递给存储过程(最初使用)EF)。但是,我被困住了,因为它看起来像sp_executesql将参数传递给存储过程,但它是空的。检查一下,这是类型: w3 Q8 F0 I6 A. y4 z
CREATE TYPE [dbo].[BigIntList] AS TABLE( [Item] [bigint] NULL)这是存储过程:. |- p& _5 r0 V; S- |( }, q' H' g
CREATE PROCEDURE [dbo].[MyProcedure] @bookEntryIds [dbo].[BigIntList] READONLYASBEGIN SET NOCOUNT ON; SELECT * FROM @bookEntryIdsEND这就是困扰我的地方: s9 @$ M+ k5 {
DECLARE @bookEntryIds [dbo].[BigIntList]INSERT INTO @bookEntryIds VALUES (50181)INSERT INTO @bookEntryIds VALUES (40182)-- 1. This returns 50181 and 40182EXEC [dbo].[MyProcedure] @bookEntryIds-- 2. This returns empty result with column "Item"EXEC sp_executesql N'[dbo].[MyProcedure]',N'@bookEntryIds [dbo].[BigIntList] READONLY',@bookEntryIds第二个查询是由物理框架使用的,所以我需要它来工作。你能告诉我发生了什么吗?我检查了一些指南,以了解如何执行这个操作,但我在这里没有发现任何错误。$ Y, N6 b' A. P; n9 {: u k
我试图将类型改为字符串(VARCHAR(100)),但结果是一样的。我在那里SQL Server
+ C* f( m4 d! Z$ w2 W) F它在2016年运行,但在2014年版本的开发(托管)计算机上也发生了同样的情况。. f8 a" {3 p! b, b2 d1 H
感谢帮助。6 x% B8 x( z" l. x7 i J2 D* m
马丁( s4 @% d2 r5 h) o+ z) ]
编辑-@sepupic解决方案:
. C b9 _& D$ d; s2 o. M如果你像我一样通过Entity Framework传递表值类型SQL& \+ c/ v) ~. S. D
Server请确保您正在传递存储过程的参数(!),例如:
5 m/ I5 X& W# p+ l1 h: c. ocontext.Database.ExecuteSqlCommand("[dbo].[MyProcedure] @bookEntryIds",parameter);
+ i$ b4 \( g M+ h! ~, Z9 q 解决方案:
- q5 e \- y E+ ^2 S -- 2. This returns empty result with column "Item"EXEC sp_executesql N'[dbo].[MyProcedure]',N'@bookEntryIds[dbo].[BigIntList] READONLY’,@bookEntryIds
1 p' l! L6 A+ q# Q7 K结果是空的,因为你忘记了传输参数,它看起来应该是这样的:) p. K( \- j1 @
EXEC sp_executesql N'[dbo].[MyProcedure] @bookEntryIds = @bookEntryIds',N'@bookEntryIds [dbo].[BigIntList] READONLY',@bookEntryIds |
|
|
|
|
|