How to fix Error 6226 on Windows Server 2025 / Windows 11

Troubleshooting Guide: SQL Server Error 6226 – “Type Marked for User-Defined Serialization”

Why This Error Happens

This error occurs when a CLR user-defined type (UDT) is configured with a Format.UserDefined serialization attribute, but SQL Server cannot locate or invoke the corresponding custom IBinarySerialize implementation at runtime. This typically happens due to an outdated, mismatched, or corrupted CLR assembly registered in the database, or because the assembly’s GetBytes/Parse methods are missing/improperly implemented. It can also surface after an in-place upgrade to SQL Server 2025 if the CLR assembly was compiled against an older .NET runtime no longer fully compatible with the new CLR host.

Step-by-Step Resolution Guide

Step 1: Identify the Affected Assembly and Type

  • Run the following query to locate the problematic UDT and its parent assembly:
  SELECT t.name AS TypeName, a.name AS AssemblyName, a.clr_name
  FROM sys.types t
  JOIN sys.assembly_types at ON t.user_type_id = at.user_type_id
  JOIN sys.assemblies a ON at.assembly_id = a.assembly_id;
  • Note the AssemblyName and TypeName reported in the error message (the %.*ls.%.*ls placeholders correspond to these).

Step 2: Validate CLR Integration and Assembly Permissions

  • Confirm CLR is enabled on the instance:
  sp_configure 'clr enabled', 1;
  RECONFIGURE;
  • Check the assembly’s PERMISSION_SET — it must be UNSAFE or EXTERNAL_ACCESS if it performs custom serialization logic:
  SELECT name, permission_set_desc FROM sys.assemblies WHERE name = '<AssemblyName>';
  • Ensure clr strict security is correctly configured (default is 1 in SQL Server 2025), and that the assembly is signed with a certificate or asymmetric key mapped to a login with UNSAFE ASSEMBLY permission.

Step 3: Drop and Re-register the Assembly

  • Script out all dependent UDTs, functions, and aggregates before dropping the assembly.
  • Drop the corrupted/outdated assembly:
  DROP ASSEMBLY [<AssemblyName>];
  • Recompile the source DLL against the .NET runtime version supported by SQL Server 2025 CLR integration, then re-add it:
  CREATE ASSEMBLY [<AssemblyName>]
  FROM 'C:\SQLAssemblies\<YourAssembly>.dll'
  WITH PERMISSION_SET = UNSAFE;
  • Recreate the UDT and any dependent objects (functions, triggers, aggregates) that reference this assembly.

Step 4: Verify the IBinarySerialize Implementation

  • Open the source code and confirm the type properly implements Microsoft.SqlServer.Server.IBinarySerialize, including both Read(BinaryReader r) and Write(BinaryWriter w) methods.
  • Ensure the [SqlUserDefinedType(Format.UserDefined, ...)] attribute includes a valid MaxByteSize value (cannot be -1 for UDTs using user-defined serialization).
  • Rebuild and redeploy the DLL once corrected, repeating Step 3.

Alternative or Verification Steps

  • After redeploying, test the type directly by inserting and selecting a sample value: DECLARE @t <SchemaName>.<TypeName>; SET @t = CONVERT(<TypeName>, '<testvalue>'); SELECT @t; — if no error is thrown, serialization is functioning correctly.
  • If the issue persists, consider migrating the UDT to Format.Native serialization (if the type is simple enough) to eliminate dependency on custom IBinarySerialize logic entirely.