Skip to content

Instantly share code, notes, and snippets.

@shammelburg
Last active April 5, 2022 18:05
Show Gist options
  • Save shammelburg/d0df009acda1d71b0c49db0cf171809b to your computer and use it in GitHub Desktop.
Save shammelburg/d0df009acda1d71b0c49db0cf171809b to your computer and use it in GitHub Desktop.
Passing UDT into SP using EF Core
//https://forums.asp.net/t/2071573.aspx?Call+SQL+Server+Function+with+UDT+as+input+parameter
public async Task<int> MainCategorySort(int BrandId, IEnumerable<MainCategoryViewModel> vm, string ModifiedBy)
{
var udt = new DataTable();
udt.Columns.Add("MainCategoryId", typeof(int));
udt.Columns.Add("CMSOrder", typeof(int));
foreach(var item in vm)
{
udt.Rows.Add(item.MainCategoryId, item.CMSOrder);
}
var parameter = new SqlParameter("@MainCategoryList", SqlDbType.Structured);
parameter.Value = udt;
parameter.TypeName = "dbo.udtMainCategory";
return await _ctx.Database.ExecuteSqlCommandAsync($"[cms].[spUpdate_MainCategorySort] {BrandId}, {parameter}, {ModifiedBy}");
}
-- User Defined Table Type
CREATE TYPE [dbo].[udtMainCategory] AS TABLE(
[MainCategoryId] [int] NOT NULL,
[CMSOrder] [tinyint] NULL
)
-- SP
CREATE PROCEDURE <Proc_Name>
(
@Id int,
@MainCategoryList AS dbo.udtMainCategory READONLY --This is a User Defined Table Type
)
AS
MERGE INTO [dbo].[MainCategory] AS target
USING @MainCategoryList AS source
ON target.[MainCategoryId] = source.[MainCategoryId] AND target.[Id] = @Id
WHEN MATCHED THEN
UPDATE SET target.[CMSOrder] = source.[CMSOrder],
target.[CMSDateModified] = GETDATE();
@MarkRobles
Copy link

It works. Great! Thanks¡

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment