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

#11 Jose TH
18/11/2008 - 13:47 | Informe spam
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
#12 JuanD
18/11/2008 - 13:50 | Informe spam
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
#13 Carlos M. Calvelo
18/11/2008 - 13:56 | Informe spam
Hola Juan,

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.




Prueba lo siguiente. Aunque no sea exactamente lo que quieres
te dará alguna idea.

Creamos un función Fechas() que devuelve una tabla con todas
las fechas en un rango y con el día de la semana ya precalculado.
La función es genérica, para poder utilizar en mas contextos.

CREATE FUNCTION Fechas(@mindate DATETIME, @maxdate DATETIME)
RETURNS @Fechas TABLE (fecha DATETIME, diasemana INT)
AS
BEGIN
WHILE @mindate <= @maxdate
BEGIN
INSERT INTO @fechas (fecha,diasemana)
VALUES (@mindate, (DATEPART(dw, @mindate)+@@DATEFIRST)%7)
SET @mindate = @mindate + 1
END
RETURN
END

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. */

La función también la puedes usar para crear una tabla (Calendario
o algo así) con un rango de fechas lo suficientemente amplio para
lo que creas que vas a necesitar. Después usas esa tabla en vez
de la función.

Saludos,
Carlos
Respuesta Responder a este mensaje
#14 JuanD
18/11/2008 - 13:58 | Informe spam
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
#15 Carlos M. Calvelo
18/11/2008 - 14:08 | Informe spam
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.

Saludos,
Carlos
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida