Estoy trabajando con SQL Server 2014 y estoy tratando de ejecutar un procedimiento almacenado (dinámico) del marco de entidades.

Mi procedimiento almacenado tiene los siguientes parámetros de entrada:

@Username          NVARCHAR(100),
@Number            DECIMAL,
@PageIndex         INT = 1,
@PageSize          INT = 20,
@Field1            NVARCHAR(12) = NULL,
@Field2            NVARCHAR(60) = NULL,
@Field3            NVARCHAR(60) = NULL,
@Field4            NVARCHAR(60) = NULL,
@Field5            NVARCHAR(60) = NULL,
@Field6            NVARCHAR(60) = 'ABC',
@Field7            NVARCHAR(4)  = 'ABC',
@IsCountOnly       BIT = 0,
@IsFilterOnly      BIT = 0

EF genera la siguiente consulta (capturada a través de SQL Profiler) según los parámetros que he agregado a mi matriz, pero tenga en cuenta que solo estoy agregando los que necesito, ya que la mayoría de ellos son opcionales.

exec sp_executesql 
N'EXEC MySp @Username, @Number, @IsCountOnly', 
N'@Username nvarchar(100), Number decimal(6,0), @IsCountOnly bit', 
@Username=N'me@mycompany.com', @Number=12345, @IsCountOnly=1

Cuando pase el nombre de @USERNAME, @Number, que son obligatorios, y luego pasan la @Scountontonly, mi procedimiento almacenado se ejecuta, pero devuelve los resultados incorrectos, ya que parece tratar el valor pasado a través de @Siscountonly como @PageIndex en lugar de @Siscountony.

Tenga en cuenta que si llamo EXEC directamente en el SQL Server Management Studio:

EXEC    [dbo].[MySp]
@Username = N'me@mycompany.com',
@Number = 12345,
@IsCountOnly = 1
GO

Funciona como se esperaba.

Para probar si este fue el problema, incluí todos los parámetros en el exec sp_executesql N'EXEC ... y funcionó como se esperaba, pero parece que parece una sobremesa que tiene que definir todos los parámetros cuando solo se necesitan unos pocos en algunos escenarios.

¿Es este un error en SQL cuando se trabaja con exec sp_executesql y EXEC o estoy haciendo algo mal?

Gracias.

Actualización-1:

Tenga en cuenta que cuando digo que funcionó como se esperaba al aprobar todos los parámetros, eso no es del todo cierto, ya que cuando paso NULL para los parámetros opcionales, no está utilizando realmente los valores predeterminados proporcionados que a cierta medida tienen sentido, pero significa que tendría que Pase los valores predeterminados correctos en mi proyecto .NET en lugar de a través de SQL, que simplemente no es ideal.

0
Thierry 27 jun. 2019 a las 14:23

1 respuesta

La mejor respuesta

Puede usar parámetros con nombre:

N'EXEC MySp @Username=@Username, @Number=@Number, @IsCountOnly=@IsCountOnly''
1
Gordon Linoff 27 jun. 2019 a las 11:28