Skip to content
Tiantan
Articles

' CONCAT ' nie jest rozpoznawaną nazwą funkcji wbudowanej

On 17 lutego, 2021 by admin

Klient 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 :

wprowadź opis obrazu tutaj

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

  • Dzięki, Aaron. Kod jest trywialny do zmiany, ponieważ CONCAT () jest używany do łączenia razem niektórych ciągów znaków przed wywołaniem dynamicznego SQL SP_ExecuteSQL. Naprawdę chciałem tylko potwierdzić, że nie ma sposobu, aby odmówić dostępu do używania CONCAT () w SQL Server 2012
  • @beeks Nie ' nie znam żadnego sposób na odmówienie użytkownikom możliwości używania 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ć.
  • tak, rozumiem, jak dostosować kod do wersji 2008 R2, że jest trywialne. Dziękujemy za potwierdzenie, że nie można DENY dostępu do tej funkcji.
  • Warto zwrócić uwagę na zmianę konkatacji na + you ' Muszę upewnić się, że łączone wartości są ciągami znaków na początku, jeśli masz jakieś pola liczbowe, spróbuje je dodać (i zakończy się niepowodzeniem, ponieważ łańcuch nie jest liczbą całkowitą), więc jeśli istnieje pole numeryczne (typ), upewnij się, że najpierw konwertujesz / rzutujesz to na łańcuch

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 „+”.

Written by admin

Dodaj komentarz Anuluj pisanie odpowiedzi

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Najnowsze wpisy

  • Używając baluna z rezonansowym dipolem
  • Jaka jest różnica między “ nie może ” a “ nie może ”? [duplicate]
  • Czy w JFK możesz przemieszczać się między terminalami lotniczymi w przypadku lotów krajowych?
  • “ Głęboko docenione ” lub “ bardzo cenione ”
  • Co oznacza ' abstrakcyjne pomysły '? [zamknięte]

Archiwa

  • Luty 2021
  • Styczeń 2021
  • Grudzień 2020
  • Listopad 2020
  • Deutsch
  • Nederlands
  • Svenska
  • Norsk
  • Dansk
  • Español
  • Français
  • Português
  • Italiano
  • Română
  • Polski
  • Čeština
  • Magyar
  • Suomi
  • 日本語
  • 한국어

Copyright Tiantan 2021 | Theme by Theme in Progress | Proudly powered by WordPress

Back to top