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/EXECUTE
uprawnień 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?
źródło
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Odpowiedzi:
CONCAT
został wprowadzony w SQL Server 2012; nie ma sposobu, aby działał w SQL Server 2008 R2. Z dokumentacji :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, gdzieCONCAT
zawiedzie, 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żywanyCONCAT()
(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).źródło
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ć.DENY
uzyskać dostępu do tej funkcji.Możesz użyć funkcji ODBC CONCAT w następujący sposób:
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:
Równie dobrze możesz po prostu użyć operatora „+”.
źródło