' CONCAT ' nie jest rozpoznawaną nazwą funkcji wbudowanej
On 17 lutego, 2021 by adminKlient zgłosił, że działa na SQL Server 2012, a my dostarczyliśmy kilka zapytań testowych do testowania przed ostateczną dostawą:
” CONCAT ”nie jest rozpoznawalną nazwą funkcji wbudowanej.
Rozumiem, że CONCAT()
to nowa konstrukcja -w funkcji wprowadzonej w SQL Server 2012, co jest w porządku i dobrze, jednak poproszono mnie o wycofanie mojej zmiany, aby ta wersja 2008R2 była kompatybilna pod pozorem „użytkownik wykonujący zapytanie może nie mieć uprawnień Transact-SQL do wykonania ”. Więc tylko udowadniam, że klient najprawdopodobniej ma inną wersję SQL Server zainstalowaną w DEV niż w PROD.
Nie mogę znaleźć żadnych informacji o konkretnym odrzuceniu SELECT/EXECUTE
uprawnienia do wbudowanych funkcji o wartościach skalarnych, ale czy jest to możliwe, a jeśli tak, czy użytkownik nadal otrzymuje ten sam tekst błędu?
Komentarze
- Jeśli konkatacja nie działa, wypróbuj tę
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
- CONCAT obsługuje konkatowanie typu dziesiętnego (ID + ' _ ' + OtherID), identyfikator może być typu int.
- W starszych wersjach użyj zamiast tego:
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Odpowiedź
CONCAT
została wprowadzona w SQL Server 2012; nie ma sposobu, aby działał w SQL Server 2008 R2. Z dokumentacji :
Nie ma też sposobu, aby to się nie udało w 2012+, nawet przy poziomie kompatybilności. Więc niech twoi ludzie sprawdzą SELECT @@VERSION;
na obu serwerach; okaże się, że gdzie CONCAT
zawodzi, to < 11. Aby uczynić swój kod kompatybilnym z wcześniejszymi wersjami, będziesz potrzebować aby użyć standardowego operatora konkatenacji ciągów (+
). Nie wiem, jak byś to zrobił za pomocą funkcji skalarnej, chyba że zawsze używasz dokładnej liczby ciągów wejściowych i zmienisz kod tak, aby używał dbo.CONCAT()
zamiast CONCAT()
(będą scenariusze, w których będzie to miało znaczenie, a także jeśli twoja funkcja robi coś, czego nie robi natywna, chcesz spójnego zachowania po uaktualnieniu). Dlatego nie polecam tego podejścia. Może być konieczne dodanie obsługi NULL
i innych drobnych zmian (niemożliwe jest dokładne określenie, jak zmienić istniejący skrypt, jeśli nie możemy zobacz).
Komentarze
Odpowiedź
Możesz użyć funkcji ODBC CONCAT w ten sposób :
SELECT {fn CONCAT("foo ", "test") }
Problem polega na tym, że ta funkcja zezwala tylko na dwa parametry na czas. Więc jeśli nie chcesz użyć więcej niż dwóch w ten sposób:
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
Możesz po prostu użyj operatora „+”.
CONCAT()
, nie. Nie ' nie do końca rozumiem, co ma to związek z tym, co trzeba zrobić, aby kod działał w wersji 2008 R2. Musisz usunąćCONCAT()
, a nie go dodawać.DENY
dostępu do tej funkcji.