„CONCAT” nie jest rozpoznawalną nazwą wbudowanej funkcji

24

Klient poinformował, że działa na SQL Server 2012, a my dostarczyliśmy pewne zapytania testowe do testowania przed ostateczną dostawą:

„CONCAT” nie jest rozpoznawalną nazwą wbudowanej funkcji.

Rozumiem, że CONCAT()jest to nowa wbudowana funkcja wprowadzona w SQL Server 2012, która jest w porządku i dobrze, jednak zostałem poproszony o wycofanie mojej zmiany, aby uczynić 2008R2 kompatybilnym pod pozorem „użytkownik wykonujący zapytanie może nie mieć uprawnienia do wykonywania Transact-SQL. ” Udowadniam więc, że klient najprawdopodobniej ma inną wersję SQL Servera zainstalowaną w DEV niż w PROD.

Nie mogę znaleźć żadnych informacji na temat konkretnego odmowy SELECT/EXECUTEuprawnień dla wbudowanych funkcji o wartości skalarnej, ale czy jest to możliwe, a jeśli tak, to czy użytkownik nadal otrzymuje ten sam tekst błędu?

pszczoły
źródło
Jeśli concat nie działa, spróbuj tegoSELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
Nilachal Sethi
CONCAT obsługuje concat typu dziesiętnego (ID + „_” + OtherID), ID może być typu int.
Zhang
W starszych wersjach użyj tego zamiast:DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Jack Whittaker

Odpowiedzi:

21

CONCATzostał wprowadzony w SQL Server 2012; nie ma sposobu, aby działał w SQL Server 2008 R2. Z dokumentacji :

wprowadź opis zdjęcia tutaj

Nie ma również sposobu, aby spowodować awarię w 2012+, nawet przy poziomie zgodności. Niech więc twoi ludzie sprawdzą SELECT @@VERSION;na obu serwerach; przekonasz się, że tam, gdzie CONCATzawiedzie, jest to <11. Aby dostosować kod do wcześniejszych wersji, musisz użyć standardowego operatora konkatenacji ciągów ( +). Nie wiem, jak byś to zrobił za pomocą funkcji skalarnej, chyba że zawsze używałeś dokładnie tej samej liczby łańcuchów wejściowych idbo.CONCAT() zamiast tego zmienisz kod na używany CONCAT()(będą scenariusze, w których będzie to miało znaczenie, a jeśli twoja funkcja coś zrobi natywny nie robi, chcesz spójne zachowanie, jeśli / podczas aktualizacji). Więc nie poleciłbym tego podejścia. Być może trzeba będzie dodaćNULL obsługa i inne drobne zmiany (nie można powiedzieć, jak dokładnie zmienić istniejący skrypt, jeśli go nie widzimy).

Aaron Bertrand
źródło
Dzięki, Aaron. Kod jest trywialny do zmiany, ponieważ CONCAT () jest po prostu używany do łączenia niektórych ciągów razem przed dynamicznym wywołaniem SQL SP_ExecuteSQL. Naprawdę chciałem tylko potwierdzić, że nie ma sposobu, aby odmówić dostępu do korzystania z CONCAT () w SQL Server 2012
beeks
1
@beeks Nie znam żadnego sposobu, aby odmówić użytkownikom możliwości korzystania CONCAT(), nie. Jednak nie do końca rozumiem, jaki to ma związek z tym, co musisz zrobić, aby kod działał w 2008 R2. Musisz go usunąć CONCAT() , a nie dodać.
Aaron Bertrand
1
tak, rozumiem, jak uczynić kod kompatybilnym z 2008 R2, co jest trywialne. Dziękujemy za potwierdzenie, że nie można DENYuzyskać dostępu do tej funkcji.
pszczoły
Uwaga: zmieniając konkat na +, musisz upewnić się, że konkatenowane wartości są łańcuchami na początek, jeśli masz jakieś pola numeryczne, spróbuje je dodać (i nie powiedzie się, ponieważ łańcuch nie jest liczbą całkowitą), więc jeśli istnieje pole numeryczne (typ), upewnij się, że najpierw przekonwertujesz / rzucisz na ciąg
Ste Bov
3

Możesz użyć funkcji ODBC CONCAT w następujący sposób:

SELECT {fn CONCAT('foo ', 'test') }

Problem polega na tym, że ta funkcja pozwala tylko na dwa parametry na raz. Więc jeśli nie chcesz użyć więcej niż dwóch takich:

SELECT {fn CONCAT('foo ', {fn CONCAT('test ', 'buddy')}) }

Równie dobrze możesz po prostu użyć operatora „+”.

bfs
źródło