funcția de creare trebuie să fie singura declarație din lot (Programare, Server Sql)

user3885474 a intrebat.

Primesc această eroare de la funcție:

CREATE FUNCTION getLavel(@id int ,@lavel char)
RETURNS date
BEGIN
 DECLARE @date date
    select @date = (select authorization_date from Authorized WHERE diver_number = @id and @lavel =level_name)
    return @date
END
GO

Care poate fi motivul?

Vă mulțumesc foarte mult.

Comentarii

  • Ce eroare primiți? –  > Por juergen d.
  • Pentru că ai înghesuit totul pe o singură linie. De ce folosești o subinterogare pentru a popula o variabilă? Toată chestia asta arată ca un candidat bun pentru o funcție intvf în loc de o funcție scalară. –  > Por Sean Lange.
  • Declarația dvs. este inclusă cu altele într-un script? Dacă da, declarația dinaintea funcției dvs. are nevoie de un GO la sfârșit. –  > Por Dave Mason.
7 răspunsuri
Sean Lange

Transformați acest lucru într-o funcție valoroasă de tabel în linie. Aceasta va avea o performanță mai bună decât funcția scalară. De asemenea, NU ar trebui să utilizați dimensiunile implicite pentru tipurile de date de caractere. Știți care este lungimea implicită pentru un char? Știați că aceasta poate varia în funcție de utilizare?

CREATE FUNCTION getLavel
(
    @id int
    , @lavel char --You need to define the length instead of the default length
) 
RETURNS table
return 
    select authorization_date 
    from Authorized 
    WHERE diver_number = @id 
        and @lavel = level_name

GO

Comentarii

  • A funcționat! Cum pot apela această funcție și trimite variabilele? ALTER TABLE Diving ADD CONSTRAINT… –  > Por user3885474.
  • am încercat: ‘ALTER TABLE Diving ADD CONSTRAINT getLavel CHECK (dbo.getLavel(guide, „guide”) != null );’ dar primesc această eroare: Nu se poate găsi nici coloana „dbo”, nici funcția definită de utilizator sau agregatul „dbo.getLavel”, sau numele este ambiguu. –  > Por user3885474.
  • Creezi scalarul pentru a-l putea folosi ca o constrângere pe coloana ta? Nu ați menționat acest lucru inițial. Nu puteți utiliza o funcție valorică de tabel ca hack de constrângere. Va trebui să vă întoarceți la o funcție scalară pentru asta. –  > Por Sean Lange.
  • Îmi cer scuze, puteți explica care este diferența dintre o funcție scalară și una scalară? –  > Por user3885474.
  • Încercați acest link. Poate explica mai clar decât mine. technet.microsoft.com/en-us/library/… –  > Por Sean Lange.
nicV

Funcția trebuie să fie fie singura funcție din fereastra de interogare SAU singura declarație din lot. Dacă există mai multe declarații în fereastra de interogare, puteți să o faceți să fie singura „din lot”, înconjurând-o cu GO-uri.

De exemplu

GO
CREATE FUNCTION getLavel(@id int ,@lavel char)
RETURNS date
BEGIN
 DECLARE @date date
    select @date = (select authorization_date from Authorized WHERE     diver_number = @id and @lavel =level_name)
    return @date
END
GO

FoxArc

Trebuie să adăugați RETURN înainte de instrucțiunea END

Asta ar trebui să rezolve problema ta, asta a rezolvat-o și pe a mea 😀

WantToBeAnonomous

Asigură-te că această instrucțiune este singurul sql din fereastra de interogare înainte de a o executa.

Sau puteți evidenția declarația funcției și executa

Adarsh Bhalani

Eroarea vă este dată în singura pagină de interogare Dar dacă executați interogarea, atunci aceasta se va executa cu succes.

CREATE FUNCTION getLavel(@id int ,@lavel char)
RETURNS date
BEGIN
 DECLARE @date date
    select @date = (select authorization_date from Authorized WHERE diver_number = @id and @lavel = level_name)
    return @date
END
GO

Dl Rabin Shrestha
CREATE FUNCTION CalculateAge(@DOB  DATE) 
RETURNS INT 
AS
BEGIN
DECLARE @Age INT
SET @DOB='08/12/1990'
SET @Age =DATEDIFF(YEAR,@DOB,GETDATE()) -
   CASE
        WHEN (MONTH (@DOB)>  MONTH (GETDATE ())) OR
             (MONTH (@DOB)= MONTH (GETDATE ())  AND DAY (@DOB) >DAY (GETDATE ()))

    THEN 1 
    ELSE 0
    END 
SELECT @Age
END

Comentarii

  • Bine ați venit pe stackoverflow! Ar fi de ajutor dacă ați adăuga o explicație despre motivul pentru care aceasta răspunde la întrebare. –  > Por mnwsmit.
Michael Malone

Ceea ce a rezolvat-o pentru mine, a fost că încercam să creez funcția în interiorul unui context de tranzacție – asta nu are sens din punctul de vedere al SQL Server. Tranzacțiile sunt pentru date, nu pentru funcții.

Scoateți instrucțiunea CREATE FUNCTION din tranzacție, apoi înfășurați-o în GO’s