ユーザ定義テーブルタイプをストアプロシージャ(EFを使用してオリジナル)に渡そうとしています。しかし、sp_executesqlがparametrをストアドプロシージャに渡すように見えますが、空です。それをチェックアウト、こちらのタイプである:ここでMsSQLが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
2番目のクエリは、エンティティによって使用されていますフレームワークなので、動作させる必要があります。あなたは何が間違っているのか教えてください。私はこれを行う方法をいくつかのガイドとチェックし、私はここで何も間違いを見る。
タイプを文字列(VARCHAR(100))に変更しようとしましたが、結果は同じでした。私はSQLサーバー2016で実行していますが、dev(ホスティング)マシンでも同じことが起こります.2014年版です。
ありがとうございました。
マーティン
EDIT - @sepupicによってソリューション:
あなたは私のようなPass table value type to SQL Server stored procedure via Entity Frameworkに触発された場合は、このパラメータを渡していることを確認してください、のように:
context.Database.ExecuteSqlCommand("[dbo].[MyProcedure] @bookEntryIds", parameter);
、声明の完全な形式は、[DBO]' EXEC sp_executesqlをN'EXECだろう[MyProcedure] @bookEntryIds = @bookEntryIds。 '、N' @ bookEntryIds [dbo]。[BigIntList] READONLY '、@bookEntryIds = @ bookEntryIds'。これにより、ストアドプロシージャを動的なEXEC SQLステートメントと呼んでいることがわかります。直接RPC呼び出しは、間接的にパラメータを渡しますが、EFがそれを直接サポートしているかどうかはわかりません。 –
ありがとうございます。今私は本当に馬鹿だと感じる。私はhttps://stackoverflow.com/questions/33772886/pass-table-value-type-to-sql-server-stored-procedure-via-entity-frameworkに触発されているため、おそらくそれを見逃してしまったでしょう。 。再度、感謝します。 –