valor NULL eliminado por el agregado u otra operación SET ?

27/06/2006 - 19:15 por Matías | Informe spam
Hola a todos, estoy tratando de eliminar columnas de una tabla temporal,
quiero eliminar las columnas que tengan todas sus filas en NULL.
Estoy usando la sentencia:

IF (SELECT COUNT(*) FROM #temp WHERE Colum3 IS NOT NULL) = 0
BEGIN
ALTER TABLE #temp
DROP COLUMN Colum3

pero me salta la advertencia: valor NULL eliminado por el agregado u otra
operación SET.

EJ.: la tabla temp. es:

Colum1 Colum2 Colum3 Colum4 Colum5

ASDF 5214 NULL 121 NULL
ASDG 4224 NULL 412 12
ASDH 5451 NULL NULL 17

Muchas gracias

Preguntas similare

Leer las respuestas

#6 Matías
27/06/2006 - 22:41 | Informe spam
Me da al ejecutarlo, ya sea desde el analizador de consultas(con exec) o
desde VB6.
Gracias.

"Alejandro Mesa" escribió en el
mensaje news:
Matías,

El error te da durante compilacion o durante ejecucion?


AMB

"Matías" wrote:

> OK, gracias, pensaba que eso me podia causar el error que me da cuando
> intento eliminar la columna:
>
> Warning: Null value is eliminated by an aggregate or other SET


operation.
> Servidor: mensaje 207, nivel 16, estado 1, procedimiento
> pa_select_notas_por_alu_materia, línea 6
> Invalid column name 'N5_1'.
> Servidor: mensaje 207, nivel 16, estado 1, procedimiento
> pa_select_notas_por_alu_materia_, línea 49
> Invalid column name 'N5_1'.
>
> lo raro es que el 1er error lo da en la linea 6, :
> insert into #temp_notas(IdAlumno, IdMateria, N1_1, N2_1, N3_1, N4_1,


N5_1,
> Pro_1, N1_2, N2_2, N3_2, N4_2, N5_2, Pro_2)
>
> la verdad no entiendo porque, ya que inserto los datos en la tabla temp.


y
> luego intento eliminar las columnas que me hacen falta.
>
> el error se cuando entra al if:
> IF not exists(SELECT * FROM #temp_notas WHERE N5_1 IS NOT NULL)
> BEGIN
> ALTER TABLE #temp_notas
> DROP COLUMN N5_1
> END
>
> si no entra al if (porq la columna es cuestion tiene por lo menos un


valor
> no nulo) funciona bien.
>
> Que podra ser ???
>
> Mil gracias
>
>
>
Respuesta Responder a este mensaje
#7 ML
28/06/2006 - 01:36 | Informe spam
Yo de nuevo hice pruebas en al analiz. de cons. y me salta el mismo
error,
ej; si ejecuto toda esta sentecia en un solo paso da error:
insert into #temp(Alumno, Materia) values ('pepe', null)
IF not exists(SELECT * FROM #temp WHERE Materia IS NOT NULL)
BEGIN
ALTER TABLE #temp
DROP COLUMN Materia
PRINT ' *** Elimino columna Materia ***'
END
SELECT * FROM #temp
(1 filas afectadas)
*** Elimino columna Materia ***
Servidor: mensaje 207, nivel 16, estado 1, línea 3
El nombre de columna 'Materia' no es válido.
Servidor: mensaje 207, nivel 16, estado 1, línea 6
El nombre de columna 'Materia' no es válido.

pero si ejecuto:
insert into #temp(Alumno, Materia) values ('pepe', null)
IF not exists(SELECT * FROM #temp WHERE Materia IS NOT NULL) -- ****
aqui
BEGIN
ALTER TABLE #temp
DROP COLUMN Materia
PRINT ' *** Elimino columna Materia ***'
END
y luego ejecuto
SELECT * FROM #temp
funciona bien, se elimino la columna en cuestion, porque?
me hace falta ejecutar todo en un solo paso ya que lo hago desde un sp.

Mil gracias
Respuesta Responder a este mensaje
#8 Alejandro Mesa
28/06/2006 - 15:49 | Informe spam
ML o Matías,

Hoy recorde que este tipo de error se provoca debido a una recompilacion del
procedimiento almacenado entre las sentencias "create table #" y "alter table
3", despues de crearse la tabla temporal y antes de ser alterada. Por razones
que desconozco, SQL Server no reconoce la estructura de la tabla temporal
causando este error.

Existe una solucion especifica al contexto donde se ejecuta es procedimiento
y esta es crear la tabla en un procedimiento externo al que la altera y
llamar desde este al procedimiento que la altera.

Ejemplos:

1 - Reproducir el error

use northwind
go

create procedure dbo.p1
as
set nocount on

create table #t (
c1 int not null identity,
c2 int
)

insert into #t default values
insert into #t default values
insert into #t default values

sentencia "alter"
if not exists (select * from #t where c2 is not null)
alter table #t drop column c2

select * from #t
go

exec dbo.p1
go

drop procedure dbo.p1
go


2 - Posible solucion

use northwind
go

create procedure dbo.p1
as
set nocount on

if not exists (select * from #t where c2 is not null)
alter table #t drop column c2
go

create procedure dbo.p2
as
set nocount on

create table #t (
c1 int not null identity,
c2 int
)

insert into #t default values
insert into #t default values
insert into #t default values

exec dbo.p1

select * from #t

drop table #t
go

exec dbo.p2
go

drop procedure dbo.p2, dbo.p1
go


AMB


"ML" wrote:


Yo de nuevo hice pruebas en al analiz. de cons. y me salta el mismo
error,
ej; si ejecuto toda esta sentecia en un solo paso da error:
insert into #temp(Alumno, Materia) values ('pepe', null)
IF not exists(SELECT * FROM #temp WHERE Materia IS NOT NULL)
BEGIN
ALTER TABLE #temp
DROP COLUMN Materia
PRINT ' *** Elimino columna Materia ***'
END
SELECT * FROM #temp
(1 filas afectadas)
*** Elimino columna Materia ***
Servidor: mensaje 207, nivel 16, estado 1, línea 3
El nombre de columna 'Materia' no es válido.
Servidor: mensaje 207, nivel 16, estado 1, línea 6
El nombre de columna 'Materia' no es válido.

pero si ejecuto:
insert into #temp(Alumno, Materia) values ('pepe', null)
IF not exists(SELECT * FROM #temp WHERE Materia IS NOT NULL) -- ****
aqui
BEGIN
ALTER TABLE #temp
DROP COLUMN Materia
PRINT ' *** Elimino columna Materia ***'
END
y luego ejecuto
SELECT * FROM #temp
funciona bien, se elimino la columna en cuestion, porque?
me hace falta ejecutar todo en un solo paso ya que lo hago desde un sp.

Mil gracias


Respuesta Responder a este mensaje
#9 Matías
28/06/2006 - 16:20 | Informe spam
Muchas gracias Alejandro por tu tiempo y dedicación, voy a probar con tu
ejemplo.
Saludos. Matías

PD: en nombre ML es porque envie el mens. desde google y olvide cambiar el
nick, ya que por el OE no me salian los mens.

"Alejandro Mesa" escribió en el
mensaje news:
ML o Matías,

Hoy recorde que este tipo de error se provoca debido a una recompilacion


del
procedimiento almacenado entre las sentencias "create table #" y "alter


table
3", despues de crearse la tabla temporal y antes de ser alterada. Por


razones
que desconozco, SQL Server no reconoce la estructura de la tabla temporal
causando este error.

Existe una solucion especifica al contexto donde se ejecuta es


procedimiento
y esta es crear la tabla en un procedimiento externo al que la altera y
llamar desde este al procedimiento que la altera.

Ejemplos:

1 - Reproducir el error

use northwind
go

create procedure dbo.p1
as
set nocount on

create table #t (
c1 int not null identity,
c2 int
)

insert into #t default values
insert into #t default values
insert into #t default values

sentencia "alter"
if not exists (select * from #t where c2 is not null)
alter table #t drop column c2

select * from #t
go

exec dbo.p1
go

drop procedure dbo.p1
go


2 - Posible solucion

use northwind
go

create procedure dbo.p1
as
set nocount on

if not exists (select * from #t where c2 is not null)
alter table #t drop column c2
go

create procedure dbo.p2
as
set nocount on

create table #t (
c1 int not null identity,
c2 int
)

insert into #t default values
insert into #t default values
insert into #t default values

exec dbo.p1

select * from #t

drop table #t
go

exec dbo.p2
go

drop procedure dbo.p2, dbo.p1
go


AMB


"ML" wrote:

>
> Yo de nuevo hice pruebas en al analiz. de cons. y me salta el mismo
> error,
> ej; si ejecuto toda esta sentecia en un solo paso da error:
> insert into #temp(Alumno, Materia) values ('pepe', null)
> IF not exists(SELECT * FROM #temp WHERE Materia IS NOT NULL)
> BEGIN
> ALTER TABLE #temp
> DROP COLUMN Materia
> PRINT ' *** Elimino columna Materia ***'
> END
> SELECT * FROM #temp
> (1 filas afectadas)
> *** Elimino columna Materia ***
> Servidor: mensaje 207, nivel 16, estado 1, línea 3
> El nombre de columna 'Materia' no es válido.
> Servidor: mensaje 207, nivel 16, estado 1, línea 6
> El nombre de columna 'Materia' no es válido.
>
> pero si ejecuto:
> insert into #temp(Alumno, Materia) values ('pepe', null)
> IF not exists(SELECT * FROM #temp WHERE Materia IS NOT NULL) -- ****
> aqui
> BEGIN
> ALTER TABLE #temp
> DROP COLUMN Materia
> PRINT ' *** Elimino columna Materia ***'
> END
> y luego ejecuto
> SELECT * FROM #temp
> funciona bien, se elimino la columna en cuestion, porque?
> me hace falta ejecutar todo en un solo paso ya que lo hago desde un sp.
>
> Mil gracias
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida