Valores de parámetros predeterminados / parámetros opcionales para procedimientos almacenados .NET en SQL Server 2005

SQL Server es un procedimiento almacenado escrito en C # en el marco .NET 2.0 que tiene un parámetro SqlInt32. Estoy tratando de hacer el parámetro opcional. Aquí hay un caso de prueba mínimo que simplemente imprime el entero que se le pasa:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void TestProc(
    SqlInt32 TestInt
    )
{
    SqlPipe pipe;
    pipe = SqlContext.Pipe;

    if (TestInt.IsNull)
    {
        pipe.Send("NULL value passed");
    }
    else
    {
        pipe.Send(TestInt.ToString());
    }
}

Estos comandos se ejecutan según lo esperado e imprimen "1" y "Se pasó el valor NULL", respectivamente:

exec dbo.TestProc @TestInt = 1
exec dbo.TestProc @TestInt = null

Sin embargo, mi objetivo es asignar un valor predeterminado de NULL a @TestInt, lo que me permitiría ejecutar solo este comando:

exec dbo.TestProc

No puedo encontrar una manera de proporcionar un valor predeterminado al parámetro dentro del código .NET. Por lo que pude encontrar en Google, .NET 4.0 soportará parámetros opcionales, así que presumiblemente, .NET 2.0 no lo hace. Y (ingenuamente) al cambiar la declaración de parámetros de esta forma, aparece el error "los especificadores de parámetros predeterminados no están permitidos":

SqlInt32 TestInt = SqlInt32.Null

También intenté sobrecargar el método agregando este código:

public static void TestProc()
{
    SqlInt32 intNull;
    intNull = SqlInt32.Null;
    TestProc(intNull);
}

Esto compila limpiamente, pero no se puede implementar: VS muestra el error "Los métodos, propiedades o campos sobrecargados no son compatibles". Así que en este punto estoy atascado.

El caso de uso real es, por supuesto, más complejo: es un módulo de registro de TSQL que llama a procedimientos almacenados para manejar mensajes de registro. El procedimiento de manejo se identifica dinámicamente en el tiempo de ejecución, y el código de llamada no sabe si está llamando a un proceso TSQL o .NET. Eso requiere que todos los procedimientos admitan los mismos parámetros, y varios son opcionales. El código de llamada ya está en producción, por lo que estoy tratando de evitar cambiarlo para pasar cada parámetro en cada llamada. En los procedimientos TSQL, no es un problema porque los parámetros opcionales son fáciles, pero aparentemente no están en .NET.

Respuestas a la pregunta(1)

Su respuesta a la pregunta