Parametros predeterminados en Procedimientos Almacenados

18/09/2008 - 08:51 por Santiago Barro | Informe spam
Hola a todos,
toda nuestra aplicación inserta, actualiza, elimina y selecciona los datos
desde procedimientos almacenados.

Hemos querido optimizar nuestra aplicación y al guardar los datos, sólo
mandamos a los procedimientos los valores que realmente han cambiado.

El problema con el que nos encontramos es que al insertar nuevos registros,
no se respectan los valores predeterminados indicado en la tabla.

Por ejemplo:
Tenemos el siguiente proc. almacenado:

CREATE PROCEDURE [dbo].[Usuario_Insert]

@Clave varchar(10)=NULL,
@Alias varchar(12)=NULL,
@GrupoUsuario smallint=NULL,
@Password varchar(10)=NULL,
@PasswordFechaCaduca datetime=NULL

AS

INSERT INTO Usuario (
Clave,
Alias,
GrupoUsuario,
Password,
PasswordFechaCaduca,)
VALUES (
@Clave,
@Alias,
@GrupoUsuario,
@Password,
@PasswordFechaCaduca)


Bien, pues resulta que en la base de datos tenemos como valores
predeterminados: GrupoUsuario = 0 y PasswordFechaCaduca=getdate().
Si a este procedimiento sólo le pasamos los valores, por ejemplo, de
@Clave='NUEVO', todos los demás campos serán NULL.

Hemos pensado que existe una fácil solución que sería indicar también en el
proc. almacenado los valores predeterminados en lugar de valores NULL, pero
no podemos asignar la función getdate() por tener que ser un valor
constante.

¿Sabeis si existe alguna manera de poder indicar en los parámetros que si no
se indica ningún valor, coja el valor predeterminado de la base de datos en
lugar del valor NULL?.

Muchas gracias y un saludo
Santiago Barro

Preguntas similare

Leer las respuestas

#1 Juan Diego Bueno
18/09/2008 - 09:22 | Informe spam
Hola Santiago:
El 18/09/2008, Santiago Barro ha supuesto :
Hola a todos,
toda nuestra aplicación inserta, actualiza, elimina y selecciona los datos
desde procedimientos almacenados.

Hemos querido optimizar nuestra aplicación y al guardar los datos, sólo
mandamos a los procedimientos los valores que realmente han cambiado.

El problema con el que nos encontramos es que al insertar nuevos registros,
no se respectan los valores predeterminados indicado en la tabla.

Por ejemplo:
Tenemos el siguiente proc. almacenado:

CREATE PROCEDURE [dbo].[Usuario_Insert]

@Clave varchar(10)=NULL,
@Alias varchar(12)=NULL,
@GrupoUsuario smallint=NULL,
@Password varchar(10)=NULL,
@PasswordFechaCaduca datetime=NULL

AS

INSERT INTO Usuario (
Clave,
Alias,
GrupoUsuario,
Password,
PasswordFechaCaduca,)
VALUES (
@Clave,
@Alias,
@GrupoUsuario,
@Password,
@PasswordFechaCaduca)


Bien, pues resulta que en la base de datos tenemos como valores
predeterminados: GrupoUsuario = 0 y PasswordFechaCaduca=getdate().
Si a este procedimiento sólo le pasamos los valores, por ejemplo, de
@Clave='NUEVO', todos los demás campos serán NULL.

Hemos pensado que existe una fácil solución que sería indicar también en el
proc. almacenado los valores predeterminados en lugar de valores NULL, pero
no podemos asignar la función getdate() por tener que ser un valor constante.

¿Sabeis si existe alguna manera de poder indicar en los parámetros que si no
se indica ningún valor, coja el valor predeterminado de la base de datos en
lugar del valor NULL?.



Se me ocurre que deberías para ello generar un INSERT INTO dinámico que
insertara únicamente los valores que no son NULL. De esa forma te
respetaría los valores por defecto de la tabla. Tampoco veo problema en
indicar los valores predeterminados en vez de NULL, ya que dentro del
proc. almacenado sí puedes usarlos. Por ejemplo:

IF @GRUPOUSUARIO IS NULL THEN SET @GRUPOUSUARIO=VALORPORDEFECTO
IF @PASSWORDFECHACADUCA IS NULL THEN SET @PASSWORDFECHACADUCA=GETDATE()
...
INSERT INTO...

Saludos

http://www.moondance.es
Respuesta Responder a este mensaje
#2 Rubén Garrigós
18/09/2008 - 09:31 | Informe spam
Hola Santiago,

Si las columnas que quereis que tengan el valor por defecto admiten nulos,
es lógico que si le indicamos en el insert que inserte NULL el valor que
tomen sea NULL. Para utilizar el valor por defecto debeis utilizar DEFAULT en
vez de NULL o no indicar dicha columna al hacer el insert. La opcion de
duplicar la especificación de defatuls no me gusta mucho pues si hay un
cambio habría que reflejarlo también en dos sitios (acordarse de ello suele
ser difícil pasado un tiempo)

El comportamiento que comentas que quieres sería por defecto si fuese una
carga bulk con INSERT ... SELECT * FROM OPENROWSET(BULK...) WITH
(KEEPDEFAULTS) pero no parece muy justificable en este caso para un único
registro.

En este caso un posible "truco" sería que sacaras los defaults haciendo algo
como un INSERT INTO <table name> DEFAULT VALUES y reemplazaras los valores de
los parámetros con éstos antes de hacer el insert aunque eso sería un poco
engorroso tener que ir haciendo y deshaciendo (aparte de malo para el
rendimiento y con problemas de concurrencia)

Creo que mi opción sería tirar de sys.columns y sys.default_columns para
sacar dichos valores por defecto y asignarlos a cada parámetro y su columna
asociada con un select @param1=COALESCE(@param1,col1_default_value), etc.

Rubén Garrigós
Solid Quality Mentors

"Santiago Barro" wrote:

Hola a todos,
toda nuestra aplicación inserta, actualiza, elimina y selecciona los datos
desde procedimientos almacenados.

Hemos querido optimizar nuestra aplicación y al guardar los datos, sólo
mandamos a los procedimientos los valores que realmente han cambiado.

El problema con el que nos encontramos es que al insertar nuevos registros,
no se respectan los valores predeterminados indicado en la tabla.

Por ejemplo:
Tenemos el siguiente proc. almacenado:

CREATE PROCEDURE [dbo].[Usuario_Insert]

@Clave varchar(10)=NULL,
@Alias varchar(12)=NULL,
@GrupoUsuario smallint=NULL,
@Password varchar(10)=NULL,
@PasswordFechaCaduca datetime=NULL

AS

INSERT INTO Usuario (
Clave,
Alias,
GrupoUsuario,
Password,
PasswordFechaCaduca,)
VALUES (
@Clave,
@Alias,
@GrupoUsuario,
@Password,
@PasswordFechaCaduca)


Bien, pues resulta que en la base de datos tenemos como valores
predeterminados: GrupoUsuario = 0 y PasswordFechaCaduca=getdate().
Si a este procedimiento sólo le pasamos los valores, por ejemplo, de
@Clave='NUEVO', todos los demás campos serán NULL.

Hemos pensado que existe una fácil solución que sería indicar también en el
proc. almacenado los valores predeterminados en lugar de valores NULL, pero
no podemos asignar la función getdate() por tener que ser un valor
constante.

¿Sabeis si existe alguna manera de poder indicar en los parámetros que si no
se indica ningún valor, coja el valor predeterminado de la base de datos en
lugar del valor NULL?.

Muchas gracias y un saludo
Santiago Barro




Respuesta Responder a este mensaje
#3 Santiago Barro
18/09/2008 - 19:02 | Informe spam
Gracias a los dos Juan y Rubén, por la información.

Supongo que nos decantaremos por la solución de Juan, que aunque sí que es
verdad que se duplican los defaults, creo que es la más facil de implementar
sin perder ningún tipo de rendimiento.

Saludos
Tiago Barro

"Rubén Garrigós" escribió en el
mensaje news:
Hola Santiago,

Si las columnas que quereis que tengan el valor por defecto admiten nulos,
es lógico que si le indicamos en el insert que inserte NULL el valor que
tomen sea NULL. Para utilizar el valor por defecto debeis utilizar DEFAULT
en
vez de NULL o no indicar dicha columna al hacer el insert. La opcion de
duplicar la especificación de defatuls no me gusta mucho pues si hay un
cambio habría que reflejarlo también en dos sitios (acordarse de ello
suele
ser difícil pasado un tiempo)

El comportamiento que comentas que quieres sería por defecto si fuese una
carga bulk con INSERT ... SELECT * FROM OPENROWSET(BULK...) WITH
(KEEPDEFAULTS) pero no parece muy justificable en este caso para un único
registro.

En este caso un posible "truco" sería que sacaras los defaults haciendo
algo
como un INSERT INTO <table name> DEFAULT VALUES y reemplazaras los valores
de
los parámetros con éstos antes de hacer el insert aunque eso sería un poco
engorroso tener que ir haciendo y deshaciendo (aparte de malo para el
rendimiento y con problemas de concurrencia)

Creo que mi opción sería tirar de sys.columns y sys.default_columns para
sacar dichos valores por defecto y asignarlos a cada parámetro y su
columna
asociada con un select @param1=COALESCE(@param1,col1_default_value), etc.

Rubén Garrigós
Solid Quality Mentors

"Santiago Barro" wrote:

Hola a todos,
toda nuestra aplicación inserta, actualiza, elimina y selecciona los
datos
desde procedimientos almacenados.

Hemos querido optimizar nuestra aplicación y al guardar los datos, sólo
mandamos a los procedimientos los valores que realmente han cambiado.

El problema con el que nos encontramos es que al insertar nuevos
registros,
no se respectan los valores predeterminados indicado en la tabla.

Por ejemplo:
Tenemos el siguiente proc. almacenado:

CREATE PROCEDURE [dbo].[Usuario_Insert]

@Clave varchar(10)=NULL,
@Alias varchar(12)=NULL,
@GrupoUsuario smallint=NULL,
@Password varchar(10)=NULL,
@PasswordFechaCaduca datetime=NULL

AS

INSERT INTO Usuario (
Clave,
Alias,
GrupoUsuario,
Password,
PasswordFechaCaduca,)
VALUES (
@Clave,
@Alias,
@GrupoUsuario,
@Password,
@PasswordFechaCaduca)


Bien, pues resulta que en la base de datos tenemos como valores
predeterminados: GrupoUsuario = 0 y PasswordFechaCaduca=getdate().
Si a este procedimiento sólo le pasamos los valores, por ejemplo, de
@Clave='NUEVO', todos los demás campos serán NULL.

Hemos pensado que existe una fácil solución que sería indicar también en
el
proc. almacenado los valores predeterminados en lugar de valores NULL,
pero
no podemos asignar la función getdate() por tener que ser un valor
constante.

¿Sabeis si existe alguna manera de poder indicar en los parámetros que si
no
se indica ningún valor, coja el valor predeterminado de la base de datos
en
lugar del valor NULL?.

Muchas gracias y un saludo
Santiago Barro







email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida