El nombre del objeto no es válido (UDF)

18/11/2008 - 10:58 por JuanD | Informe spam
Hola,

He creado la siguiente función que en teoría debería devolver la fecha de
los días con sábados que hay desde una fecha hasta hoy (desde el QA
funciona);

CREATE FUNCTION dbo.Sabados (@FechaI smalldatetime)
RETURNS @Tabla TABLE (Fecha smalldatetime)
BEGIN
declare @i int
declare @dia varchar(20)
declare @fecha datetime
select @i = 0
while @i > - DateDiff(Day, '01/10/2008', @FechaI)
begin
select @dia = DateName(dw, dateadd(d, @i, @FechaI))
select @fecha = DateAdd(d, @i, @FechaI)
if @dia in ('Sábado')
begin
INSERT INTO @Tabla Select convert(nvarchar, @fecha, 103)
end
select @i = @i - 1
end
RETURN
END

A la hora de llamarla así; Select dbo.Sabados(getdate()), me lanza el
siguiente error;

Servidor: mensaje 208, nivel 16, estado 1, línea 1
El nombre de objeto 'dbo.Sabados' no es válido.

Cuando se que el nombre de la función existe y que funciona si ejecuto el
código desde el QA, ¿qué estoy haciendo mal?.
Utilizo SQL Server 2000 SP4.
Gracias.

Preguntas similare

Leer las respuestas

#16 Jose TH
18/11/2008 - 14:08 | Informe spam
Escalar es que devuelve un valor unico, no una tabla. En este caso no te
vale ya que deseas una tabla.


"JuanD" <xxxxxxxx> escribió en el mensaje
news:
Ya por curiosidad, ¿cómo sería con una función escalar?, si el resultado
conseguido es el mismo me podría valer.
Gracias.

<Jose TH >>> escribió en el mensaje
news:
Ah Disculpa que hice la prueba con una funcion escalar y no tipo TABLE.


<Jose TH >>> escribió en el mensaje
news:
Yo lo acabo de probar en SQL 2000 sp3 y funciona bien para una Vista.
Chequea bien el error por si es otra cosa.


"JuanD" <xxxxxxxx> escribió en el mensaje
news:%23Jx%
Gracias, pero, nada que no hay manera de ninguna de las dos formas.
Empiezo a pensar que getdate no está permitido en funciones de SQL 2000

<Jose TH >>> escribió en el mensaje
news:
No uses entonces el FROM a ver,

select dbo.Sabados(getdate())

o asi, aunque innecesario quizas

select * from (select dbo.Sabados(getdate()))

chequealo a ver

"JuanD" <xxxxxxxx> escribió en el mensaje
news:
Y si hago esto;
Select * From dbo.Sabados('18/11/2008')
funciona, entonces, ¿cómo le paso la fecha actual?

"JuanD" <xxxxxxxx> escribió en el mensaje
news:%
Hola,

He creado la siguiente función que en teoría debería devolver la
fecha de los días con sábados que hay desde una fecha hasta hoy
(desde el QA funciona);

CREATE FUNCTION dbo.Sabados (@FechaI smalldatetime)
RETURNS @Tabla TABLE (Fecha smalldatetime)
BEGIN
declare @i int
declare @dia varchar(20)
declare @fecha datetime
select @i = 0
while @i > - DateDiff(Day, '01/10/2008', @FechaI)
begin
select @dia = DateName(dw, dateadd(d, @i, @FechaI))
select @fecha = DateAdd(d, @i, @FechaI)
if @dia in ('Sábado')
begin
INSERT INTO @Tabla Select convert(nvarchar, @fecha,
103)
end
select @i = @i - 1
end
RETURN
END

A la hora de llamarla así; Select dbo.Sabados(getdate()), me lanza
el siguiente error;

Servidor: mensaje 208, nivel 16, estado 1, línea 1
El nombre de objeto 'dbo.Sabados' no es válido.

Cuando se que el nombre de la función existe y que funciona si
ejecuto el código desde el QA, ¿qué estoy haciendo mal?.
Utilizo SQL Server 2000 SP4.
Gracias.

























Respuesta Responder a este mensaje
#17 Jose TH
18/11/2008 - 14:14 | Informe spam
Si no tuvieras que usar la vista puedes hacerlo facilimente con un
procedimiento almacenado.



"JuanD" <xxxxxxxx> escribió en el mensaje
news:
Gracias Jose TH, me lo temía.

Mi proposito era conseguir que me mostrara todas las fechas de sábados que
hay entre el '01/10/2008' y hoy, si alguna alma caritativa puede darme un
ejemplo de como se haría en una vista sin utilizar una función le estaría
eternemente agradecido.

Saludos.

<Jose TH >>> escribió en el mensaje
news:
Parece que realmente hay un problema con eso en SQL 2000, que por cierto
tampoco permite llamar getdate() dentro de la funcion.

http://www.forosdelweb.com/f87/func...io-583545/





<Jose TH >>> escribió en el mensaje
news:
Ah Disculpa que hice la prueba con una funcion escalar y no tipo TABLE.


<Jose TH >>> escribió en el mensaje
news:
Yo lo acabo de probar en SQL 2000 sp3 y funciona bien para una Vista.
Chequea bien el error por si es otra cosa.


"JuanD" <xxxxxxxx> escribió en el mensaje
news:%23Jx%
Gracias, pero, nada que no hay manera de ninguna de las dos formas.
Empiezo a pensar que getdate no está permitido en funciones de SQL
2000

<Jose TH >>> escribió en el mensaje
news:
No uses entonces el FROM a ver,

select dbo.Sabados(getdate())

o asi, aunque innecesario quizas

select * from (select dbo.Sabados(getdate()))

chequealo a ver

"JuanD" <xxxxxxxx> escribió en el mensaje
news:
Y si hago esto;
Select * From dbo.Sabados('18/11/2008')
funciona, entonces, ¿cómo le paso la fecha actual?

"JuanD" <xxxxxxxx> escribió en el mensaje
news:%
Hola,

He creado la siguiente función que en teoría debería devolver la
fecha de los días con sábados que hay desde una fecha hasta hoy
(desde el QA funciona);

CREATE FUNCTION dbo.Sabados (@FechaI smalldatetime)
RETURNS @Tabla TABLE (Fecha smalldatetime)
BEGIN
declare @i int
declare @dia varchar(20)
declare @fecha datetime
select @i = 0
while @i > - DateDiff(Day, '01/10/2008', @FechaI)
begin
select @dia = DateName(dw, dateadd(d, @i, @FechaI))
select @fecha = DateAdd(d, @i, @FechaI)
if @dia in ('Sábado')
begin
INSERT INTO @Tabla Select convert(nvarchar, @fecha,
103)
end
select @i = @i - 1
end
RETURN
END

A la hora de llamarla así; Select dbo.Sabados(getdate()), me lanza
el siguiente error;

Servidor: mensaje 208, nivel 16, estado 1, línea 1
El nombre de objeto 'dbo.Sabados' no es válido.

Cuando se que el nombre de la función existe y que funciona si
ejecuto el código desde el QA, ¿qué estoy haciendo mal?.
Utilizo SQL Server 2000 SP4.
Gracias.





























Respuesta Responder a este mensaje
#18 Carlos M. Calvelo
18/11/2008 - 14:17 | Informe spam
Hola otra vez Juan,

On 18 nov, 13:56, "Carlos M. Calvelo" wrote:

Ahora podemos utilizarla por ejemplo así:

select * from dbo.Fechas('20080101', '20101231')

o crear una vista:

create view vSabados as
select * from dbo.Fechas('20080101', '20101231') where diasemana=0
 /* 0=Sábado, 1=Domingo, etc. */




Tanto a la consulta como a la definición de la vista
le puedes añadir condiciones con el where, naturalmente.

Como solo quieres los sábados hasta hoy:

...
WHERE diasemana=0 AND fecha <= getdate()

Saludos,
Carlos
Respuesta Responder a este mensaje
#19 Jose TH
18/11/2008 - 14:25 | Informe spam
Sobre la lógica de la función o el procedimiento, para mayor rapidez no es
necesario ir de día en día sino buscar el primer sábado y de ahí en adelante
ir de 7 en 7. Creo que hasta una fórmula se podría hacer luego que se sabe
la fecha del primer sábado.


<Jose TH >>> escribió en el mensaje
news:OD4pc%
Si no tuvieras que usar la vista puedes hacerlo facilimente con un
procedimiento almacenado.



"JuanD" <xxxxxxxx> escribió en el mensaje
news:
Gracias Jose TH, me lo temía.

Mi proposito era conseguir que me mostrara todas las fechas de sábados
que hay entre el '01/10/2008' y hoy, si alguna alma caritativa puede
darme un ejemplo de como se haría en una vista sin utilizar una función
le estaría eternemente agradecido.

Saludos.

<Jose TH >>> escribió en el mensaje
news:
Parece que realmente hay un problema con eso en SQL 2000, que por cierto
tampoco permite llamar getdate() dentro de la funcion.

http://www.forosdelweb.com/f87/func...io-583545/





<Jose TH >>> escribió en el mensaje
news:
Ah Disculpa que hice la prueba con una funcion escalar y no tipo TABLE.


<Jose TH >>> escribió en el mensaje
news:
Yo lo acabo de probar en SQL 2000 sp3 y funciona bien para una Vista.
Chequea bien el error por si es otra cosa.


"JuanD" <xxxxxxxx> escribió en el mensaje
news:%23Jx%
Gracias, pero, nada que no hay manera de ninguna de las dos formas.
Empiezo a pensar que getdate no está permitido en funciones de SQL
2000

<Jose TH >>> escribió en el mensaje
news:
No uses entonces el FROM a ver,

select dbo.Sabados(getdate())

o asi, aunque innecesario quizas

select * from (select dbo.Sabados(getdate()))

chequealo a ver

"JuanD" <xxxxxxxx> escribió en el mensaje
news:
Y si hago esto;
Select * From dbo.Sabados('18/11/2008')
funciona, entonces, ¿cómo le paso la fecha actual?

"JuanD" <xxxxxxxx> escribió en el mensaje
news:%
Hola,

He creado la siguiente función que en teoría debería devolver la
fecha de los días con sábados que hay desde una fecha hasta hoy
(desde el QA funciona);

CREATE FUNCTION dbo.Sabados (@FechaI smalldatetime)
RETURNS @Tabla TABLE (Fecha smalldatetime)
BEGIN
declare @i int
declare @dia varchar(20)
declare @fecha datetime
select @i = 0
while @i > - DateDiff(Day, '01/10/2008', @FechaI)
begin
select @dia = DateName(dw, dateadd(d, @i, @FechaI))
select @fecha = DateAdd(d, @i, @FechaI)
if @dia in ('Sábado')
begin
INSERT INTO @Tabla Select convert(nvarchar, @fecha,
103)
end
select @i = @i - 1
end
RETURN
END

A la hora de llamarla así; Select dbo.Sabados(getdate()), me lanza
el siguiente error;

Servidor: mensaje 208, nivel 16, estado 1, línea 1
El nombre de objeto 'dbo.Sabados' no es válido.

Cuando se que el nombre de la función existe y que funciona si
ejecuto el código desde el QA, ¿qué estoy haciendo mal?.
Utilizo SQL Server 2000 SP4.
Gracias.

































Respuesta Responder a este mensaje
#20 Juan Diego Bueno
18/11/2008 - 14:27 | Informe spam
Hola Carlos:

On 18 nov, 14:08, "Carlos M. Calvelo" wrote:
Hola Diego,

On 18 nov, 13:25, Juan Diego Bueno wrote:



> Hola JuanD:

> On 18 nov, 12:59, "JuanD" <xxxxxxxx> wrote:

> > Gracias, pero no me vale porque debo utilizar la función dentro de una vista
> > y las vistas no me dejan utilizar variables.

> > "Juan Diego Bueno" escribió en el mensajenews:
> > Hola JuanD:

> > ¿Has probado a guardar primero GETDATE() en una variable de tipo
> > datetime y pasársela a la función de usuario?

> Pues entonces, lo mejor sería que integraras el GETDATE() dentro de la
> propia función, por ejemplo, si se le pasa un NULL a la función o una
> fecha tipo 1/1/1900 que la cambie por la fecha actual. De esa forma
> podrás usar la función tanto para una fecha estática como para la
> actual

GETDATE() es una función 'nondeterministic' y no se puede
usar para definir UDF's (de las que se supone que si tienen
que ser 'deterministic').
Una función 'nondeterministic', realmente no es una función  :)
Busca en la ayuda.



Gracias Carlos, son de estas cosas que uno olvida hasta que tiene que
usarlas.

Un saludo
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida