Tengo un código similar al siguiente en un procedimiento almacenado que inserta una fila en una tabla, me gustaría establecer la última columna (CampoD) a @prmSomeValue a menos que sea nulo, de lo contrario simplemente use el valor predeterminado definido para esa columna.¿Hay alguna manera de utilizar de forma condicional los valores de columna predeterminados en una instrucción INSERT..SELECT?
IF (@prmSomeValue IS NULL)
INSERT INTO MyTable (fieldA,FieldB,FieldC)
SELECT A,B,C
FROM MyOtherTable
ELSE
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,@prmSomeValue
FROM MyOtherTable
Esto funciona, pero infringe el principio DRY. Estoy tratando de encontrar la forma de hacer esto con una única instrucción de inserción. Algo similar al siguiente pseudocódigo.
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,ISNULL(@prmSomeValue,DEFAULT)
FROM MyOtherTable
¿Alguien tiene alguna idea?
Actualización - Una mayor restricción de giro
El defecto no es un valor literal, sino una función que se muestra a continuación.
...DEFAULT (suser_sname()) FOR [FieldD]
actualización
finalmente despejaron y elegimos el menor de los males y acaba de copiar la función de valor por defecto en mi consulta en lugar de caer hasta el valor estándar configurado para la columna. No me gusta, pero hace el trabajo con menos repetición en mi consulta.
INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)
SELECT A,B,C,ISNULL(@prmSomeValue,suser_sname())
FROM MyOtherTable
Interesante idea. No estoy seguro de si es preferible, pero definitivamente vale la pena votar. – JohnFx
Gracias a JohnFx, creo que podría ser preferible una vez que haya más de una columna opcional que deba tratarse de esta manera. Entonces puedes decir "SI @foo NO ES NULO O @bar NO ES NULO, ACTUALIZA SET foo = COALESCE (@foo, foo), bar = COALESCE (@bar, bar) WHERE" etc., en lugar de escribir una instrucción de inserción para cada combinación posible. –
Use ISNULL en lugar de COALESCE, COALESCE está pensado para múltiples argumentos. No me decantaría por los enfoques campo = parámetro/campo, mata el rendimiento de SQL, dificultando la optimización de consultas y el uso de índices. Una simple instrucción if sería mucho más eficiente. – Zyphrax