MSSQL Tworzenie funkcji - problem

0

Cześć, mam problem, którego nie oczekiwałem przy tworzeniu funkcji. Mój skrypt wygląda tak:

 
-- wcześniej deklaruje i pobieram wartość dla dbVer
if @dbVer=4.0
begin  
  if exists(select * from information_schema.routines 
  where specific_name = 'DateTimeToUnix' and routine_type = 'FUNCTION') 
  drop function DateTimeToUnix -- błąd 1
  GO

  CREATE function [dbo].[DateTimeToUnix] -- błąd 2
    ( @DAY datetime )
    returns int
    as
    begin
	  declare @wkdt datetime

      if @DAY < '1901-12-13 20:45:51.500' or @DAY > '2038-01-19 03:14:07.497'
	  return null

	  select @wkdt = dateadd(ms,round(datepart(ms,@DAY),-3)-datepart(ms,@DAY),@DAY)

	  if @wkdt >= 712 return datediff(ss,25567,@wkdt) 

	  return -2147472000-datediff(ss,@wkdt,712)

    end
end

I teraz tak. Jeśli nie mam warunku IF EXISTS, błąd wyskakuje na linijce z CREATE:
Incorrect syntax near the keyword 'function'.

Jeśli mam IF EXISTS, błąd występuje na linijce DROP:
Incorrect syntax near 'DateTimeToUnix'.

O co tu chodzi? Czemu to nie działa? Oczywiście, jeśli pozbędę się warunku IF @dbVer..., to jest ok :|

0

Spróbuj bez GO.

0
MiL napisał(a)

Spróbuj bez GO.

Z GO, czy bez jest to samo.

0

Nie możesz w jednym zapytaniu usuwać i tworzyć funkcji.

Co do instrukcji "GO". Jest ona obsługiwana tylko przez narzędzia typu queryanaliser. Nie używaj tego w żadnym projekcie.

//... no tak, doczytałem.. wnioskuję, że to wszystko wiesz...

0

No GO uzywam tylko w "Query Analizerze".
Czytam w necie, ale nic nie mogę znaleźć na ten temat. Za chwilę dojdę do wniosku, że coś takiego, co chcę osiągnąć jest niemożliwe, ale nie chce mi się w to wierzyć.

1

Faktycznie to nie działa, ale działa to:

 
IF @dbVer = 4 AND NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[DateTimeToUnix]') AND xtype in (N'FN', N'IF', N'TF') ) 
BEGIN
execute dbo.sp_executesql @statement = N' 
  CREATE FUNCTION [dbo].[DateTimeToUnix] -- błąd 2
    ( @DAY datetime )
    RETURNS INT
    AS
    BEGIN
          DECLARE @wkdt datetime
 
      IF @DAY < ''1901-12-13 20:45:51.500'' OR @DAY > ''2038-01-19 03:14:07.497''
          RETURN NULL
 
          SELECT @wkdt = dateadd(ms,round(datepart(ms,@DAY),-3)-datepart(ms,@DAY),@DAY)
 
          IF @wkdt >= 712 RETURN datediff(ss,25567,@wkdt) 
 
          RETURN -2147472000-datediff(ss,@wkdt,712)
 
    END' 
END

GO

1 użytkowników online, w tym zalogowanych: 0, gości: 1