2011-08-23 16 views
5

Me siento como un idiota, pero no puedo hacer que este SP predeterminado sea un valor ... Así es como declaro mis parámetros.Valores de parámetros predeterminados en el procedimiento almacenado de SQL Server 2008

ALTER PROCEDURE [dbo].[PCS_DocumentCacheInsert] 
(
    @sessionId varchar(200), 
    @mrn varchar(50) , 
    @fromDate datetime, 
    @toDate datetime, 
    @aggregate varchar(50), 
    @author varchar(50), 
    @datePerformed dateTime, 
    @docId varchar(15), 
    @encounterId varchar(15), 
    @facility varchar(5), 
    @level char(1), 
    @orderedByAuthor varchar(50), 
    @resultAuthor varchar(50), 
    @resultCode varchar(5), 
    @resultId varchar(30), 
    @resultName varchar(30), 
    @status varchar(5), 
    @subType varchar(10), 
    @type varchar(10), 
    @security varchar(3), 
    @serviceGroup varchar(15), 
    @witmurNum varchar(10), 
    @deptId varchar(10), 
    @deptText varchar(40), 
    @cacheCreateTS dateTime , 
    @cacheStatus varchar(8) ='notReady', 
    @cacheUpdateTS datetime 
) 

Todo funciona bien con este proc excepto que no puedo conseguir notReady por defecto para @cacheStatus. Google dice que estoy usando la sintaxis correcta.

Así es como yo llamo en la EM

EXEC @return_value = [dbo].[PCS_DocumentCacheInsert] 
    @sessionId = N'asdfssa', 
    @mrn = N'asdf', 
    @fromDate = NULL, 
    @toDate = NULL, 
    @aggregate = NULL, 
    @author = N'author', 
    @datePerformed = NULL, 
    @docId = N'id', 
    @encounterId = NULL, 
    @facility = NULL, 
    @level = NULL, 
    @orderedByAuthor = NULL, 
    @resultAuthor = NULL, 
    @resultCode = NULL, 
    @resultId = NULL, 
    @resultName = NULL, 
    @status = NULL, 
    @subType = NULL, 
    @type = NULL, 
    @security = NULL, 
    @serviceGroup = NULL, 
    @witmurNum = NULL, 
    @deptId = NULL, 
    @deptText = NULL, 
    @cacheCreateTS = NULL, 
    @cacheStatus = NULL, 
    @cacheUpdateTS = NULL 

SELECT 'Valor de retorno' = @return_value

GO

por lo que añade esto y su trabajo ahora, pero no entiendo ¿Por qué cuando hago clic derecho y digo Ejecutar procedimiento almacenado, entonces selecciono las casillas de verificación nulas por qué no sería el valor predeterminado? Supongo que al comprobar que null envía 'NULL' al proc y no a DBNull?

if @cacheStatus is null 
begin 
    set @cacheStatus ='notReady' 
end 
+0

alguna posibilidad de que pueda proporcionar una muestra de cómo el SP se llama? – Justin

+0

Tu sintaxis se ve bien. Compruebe el valor que está pasando a @cachStatus. (es decir, asegúrese de no estar pasando uno). – Chains

+0

Lo estoy llamando desde marcos de entidad (desde un servicio WCF) y en el estudio de gestión el mismo comportamiento, ambos lugares no establecen el valor – cobolstinks

Respuesta

17

¿Está seguro de que no está enviando nulo como valor para ese parámetro? El valor predeterminado solo se usa si no envía ningún parámetro en absoluto.

@JNK sugiere una solución de este tipo si usted tiene este problema:

IF @Cachestatus IS NULL SET @cachestatus = 'NotReady' 
+4

+1 - solución alternativa sería agregar 'IF @Cachestatus IS NULL SET @cachestatus = 'NotReady'' – JNK

+0

@JNk agrega eso como una respuesta separada ya que realmente es lo que debería aceptarse si este es realmente su problema. – HLGEM

+0

@HL - No habría llegado a eso sin que me indique que pase 'NULL', así que no hay problema. Agregue una línea a su respuesta para eso. – JNK

3

llamada así:

EXEC @return_value = [dbo].[PCS_DocumentCacheInsert] 
    @sessionId = N'asdfssa', 
    @mrn = N'asdf', 
    @fromDate = NULL, 
    @toDate = NULL, 
    @aggregate = NULL, 
    @author = N'author', 
    @datePerformed = NULL, 
    @docId = N'id', 
    @encounterId = NULL, 
    @facility = NULL, 
    @level = NULL, 
    @orderedByAuthor = NULL, 
    @resultAuthor = NULL, 
    @resultCode = NULL, 
    @resultId = NULL, 
    @resultName = NULL, 
    @status = NULL, 
    @subType = NULL, 
    @type = NULL, 
    @security = NULL, 
    @serviceGroup = NULL, 
    @witmurNum = NULL, 
    @deptId = NULL, 
    @deptText = NULL, 
    @cacheCreateTS = NULL, 
    [email protected] = NULL, 
    @cacheUpdateTS = NULL 

no se puede pasar @cacheStatus si desea que el defecto se acostumbre .

2

Otra opción que aún no se ha mencionado es utilizar la palabra clave "DEFAULT" en lugar de pasar un valor NULL.

Así que cuando se llama al SP del código sería:

EXEC @return_value = [dbo].[PCS_DocumentCacheInsert] 
    @sessionId = N'asdfssa', 
    @mrn = N'asdf', 
    @fromDate = NULL, 
    ... Just got rid of some lines to focus on the param in question - see DEFAULT below 
    @cacheCreateTS = NULL, 
    @cacheStatus = DEFAULT, 
    @cacheUpdateTS = NULL 
Cuestiones relacionadas