A ' CONCAT ' nem egy elismert beépített függvénynév
On február 17, 2021 by adminEgy ügyfél arról számolt be, hogy az SQL Server 2012 rendszeren futnak, és tesztelési lekérdezéseket küldtünk tesztelésre a végső kézbesítés előtt:
” A CONCAT “nem egy elismert beépített függvénynév.
Tudomásul veszem, hogy a CONCAT()
egy új építésű -in függvény, amelyet az SQL Server 2012-ben vezettek be, ami minden rendben van, de felkértek, hogy állítsam vissza a változtatásomat, hogy ez a 2008R2 kompatibilis legyen annak leple alatt, hogy “a lekérdezést végrehajtó felhasználónak nincs Transact-SQL jogosultsága végrehajtani . ” Tehát csak azt bizonyítom, hogy az ügyfélnek valószínűleg az SQL Server más verziója van telepítve a DEV-be, mint a PROD-ben.
Nem találok információt a engedélyek a beépített skaláris értékű függvényekhez, de lehetséges-e, és ha igen, a felhasználó továbbra is ugyanazt a hibaszöveget kapja?
Megjegyzések
Válasz
CONCAT
bevezetésre került az SQL Server 2012-ben; nincs mód arra, hogy működjön az SQL Server 2008 R2 rendszerben. A dokumentációból :
Ezenkívül a kompatibilitási szint mellett sem lehet meghibásodni 2012+-ban. Tehát kérje embereit, hogy ellenőrizzék a SELECT @@VERSION;
-t mindkét szerveren; Meg fogja találni, hogy ahol a CONCAT
nem sikerül, az < 11. Annak érdekében, hogy a kód kompatibilis legyen a korábbi verziókkal, ” a szabványos karakterlánc-összefűzés operátor használatához (+
). Nem tudom, hogyan csinálnád ezt egy skalárfüggvénnyel, hacsak nem mindig a pontos azonos számú bemeneti karakterláncot használtad és megváltoztatja a kódot, hogy dbo.CONCAT()
-et használjon a CONCAT()
helyett (lesznek forgatókönyvek, ahol ez számít ha a funkciója bármit megtesz, amit a natív nem tesz, akkor következetes viselkedést szeretne, ha / amikor frissít). Tehát nem javasolnám ezt a megközelítést. Lehetséges, hogy hozzá kell adnia a NULL
kezelést és egyéb apróbb módosításokat is (lehetetlen megmondani, hogyan módosítsuk pontosan a meglévő szkriptet, ha nem tudjuk lásd:).
Megjegyzések
- Köszönöm, Aaron. A kód triviális a változtatáshoz, mivel a CONCAT () csak néhány karaktersorozat összekapcsolására szolgál az SP_ExecuteSQL dinamikus SQL hívás előtt. Valójában csak meg akartam erősíteni, hogy semmilyen módon nem lehet megtagadni a hozzáférést a CONCAT () használatához az SQL Server 2012-ben.
- @beeks Nem ismerek semmit. <
megtagadhatja a felhasználóktól a CONCAT()
használatának lehetőségét. Nem nagyon követem ', hogy ennek milyen hatása van arra, hogy mit kell tennie ahhoz, hogy a kód működjön a 2008 R2-n. el kell távolítania CONCAT()
, nem pedig hozzáadni.
DENY
hozzáférni ehhez a funkcióhoz. Válasz
Az ODBC CONCAT függvényt így használhatja :
SELECT {fn CONCAT("foo ", "test") }
Ezzel az a probléma, hogy ez a függvény csak két paramétert engedélyez egy időben. Tehát, hacsak nem kettőnél többet akar használni, mint ez:
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
Lehet, hogy valamint használja a “+” operátort.
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;