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.
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
- A funcționat! Cum pot apela această funcție și trimite variabilele? ALTER TABLE Diving ADD CONSTRAINT… – > .
- 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. – > .
- 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. – > .
- Îmi cer scuze, puteți explica care este diferența dintre o funcție scalară și una scalară? – > .
- Încercați acest link. Poate explica mai clar decât mine. technet.microsoft.com/en-us/library/… – > .
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
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 😀
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
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
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
- 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. – > .
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
GO
la sfârșit. – > Por Dave Mason.