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

#21 JuanD
18/11/2008 - 16:09 | Informe spam
Muchas gracias Carlos, me sirve perfectamente

"Carlos M. Calvelo" escribió en el mensaje
news:
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
#22 JuanD
18/11/2008 - 16:10 | Informe spam
Gracias Jose TH por tu paciencia, el ejemplo de Carlos me va bien.
Saludos.

<Jose TH >>> escribió en el mensaje
news:
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
#23 Carlos Sacristan
18/11/2008 - 16:21 | Informe spam
Pues con una función escalar podría ser como la que sigue:

CREATE FUNCTION dbo.fn_NumberOfSats (@s DATETIME, @e DATETIME)
RETURNS INT AS
BEGIN
DECLARE @wks INT, @satDays INT

SET @wks = DATEDIFF( week, @s, @e) - 1
SELECT @satDays = @wks

IF DATEPART(weekday, @s + @@DATEFIRST - 1) < 7
SELECT @satDays = @satDays + 1

IF DATEPART(weekday, @e + @@DATEFIRST- 1) IN(6, 7)
SELECT @satDays = @satDays + 1

RETURN (@satDays)
END

GO

SELECT dbo.fn_NumberOfSats('20081001', GETDATE()) AS numberOfSats


Un saludo
-
www.navento.com
Servicios de Localización GPS


"JuanD" wrote:

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
#24 Carlos M. Calvelo
18/11/2008 - 16:25 | Informe spam
On 18 nov, 16:09, "JuanD" <xxxxxxxx> wrote:
Muchas gracias Carlos, me sirve perfectamente




De nada Juan.

Si no te interesa tener una función tan genérica porque solo le
ves aplicación para lo de los sábados, pues defines una función
más específica y la usas igual que la función Fechas().

Esta función devuelve una tabla con solo una columna con todos
los sábados entre dos fechas:

CREATE FUNCTION Sabados(@mindate DATETIME, @maxdate DATETIME)
RETURNS @Fechas TABLE (fecha DATETIME)
AS
BEGIN
DECLARE @ds INT

SET @ds = (DATEPART(dw, @mindate)+@@DATEFIRST)%7
IF @ds <> 0 -- @mindate no es sábado?
SET @mindate = @mindate + 7 - @ds -- sábado siguiente!

WHILE @mindate <= @maxdate
BEGIN
INSERT INTO @fechas (fecha) VALUES (@mindate)
SET @mindate = @mindate + 7
END
RETURN
END

Saludos,
Carlos
Respuesta Responder a este mensaje
#25 Jose TH
18/11/2008 - 16:36 | Informe spam
Por nada aunque con ese ejemplo cuando cambies de año tendrás que modificar
la definición de la vista. .
Yo evaluaría finalmente la necesidad de tener una vista así y no mejor hacer
un Store procedure.

Otra opción que tienes es cambiar de versión a SQL Server 2008 que si no me
equivoco creo no tiene al menos el problema de llamar a getdate() dentro de
la funcion o en el parametro.


"JuanD" <xxxxxxxx> escribió en el mensaje
news:
Gracias Jose TH por tu paciencia, el ejemplo de Carlos me va bien.
Saludos.

<Jose TH >>> escribió en el mensaje
news:
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
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida