' CONCAT ' není rozpoznaný název vestavěné funkce
On 17 února, 2021 by adminKlient uvedl, že běží na serveru SQL Server 2012, a my jsme před konečným doručením doručili několik testovacích dotazů pro testování:
“ CONCAT „není rozpoznaný název vestavěné funkce.
chápu, že CONCAT()
je nově vytvořený -in funkce zavedená na serveru SQL Server 2012, což je v pořádku a dobře, nicméně jsem byl požádán, abych vrátil svoji změnu, aby byl tento 2008R2 kompatibilní pod rouškou „uživatel, který provádí dotaz, nemusí mít oprávnění k provedení Transact-SQL . “ Takže jen dokazuji, že klient má s největší pravděpodobností v DEV nainstalovanou jinou verzi serveru SQL než v PROD.
Nemohu najít žádné informace o konkrétním odepření SELECT/EXECUTE
oprávnění pro vestavěné skalární funkce, ale je to možné, a pokud ano, uživatel stále obdrží stejný text chyby?
Komentáře
Odpověď
CONCAT
byl představen v SQL Server 2012; neexistuje způsob, jak zajistit, aby fungoval v SQL Server 2008 R2. Z dokumentace :
Neexistuje způsob, jak v 2012+ selhat, a to ani na úrovni kompatibility. Nechte své lidi zkontrolovat SELECT @@VERSION;
na obou serverech; zjistíte, že tam, kde CONCAT
selže, je < 11. Aby byl váš kód kompatibilní se staršími verzemi, budete potřebovat použít standardní operátor zřetězení řetězců (+
). Nevím, jak byste to provedli se skalární funkcí, pokud jste vždy nepoužili přesný stejný počet vstupních řetězců a změníte kód tak, aby místo CONCAT()
používal dbo.CONCAT()
(budou existovat scénáře, na kterých to záleží, plus pokud vaše funkce dělá něco, co nativní nedělá, chcete konzistentní chování, pokud / když upgradujete). Takže bych tento přístup nedoporučoval. Možná budete muset přidat manipulaci NULL
a další drobné změny (nelze vám říci, jak přesně změnit stávající skript, pokud nemůžeme vidět).
Komentáře
- Díky, Aarone. Kód je triviální změnit, protože CONCAT () se právě používá ke spojení některých řetězců před dynamickým voláním SQL SP_ExecuteSQL. Opravdu jsem chtěl jen potvrdit, že neexistuje žádný způsob, jak odepřít přístup k používání CONCAT () na serveru SQL Server 2012
- @beeks Nevím ' o žádné způsob, jak odepřít uživatelům možnost používat
CONCAT()
, č. Nesleduji ' úplně to, co má vliv na to, co musíte udělat, aby kód fungoval na 2008 R2. Musíte odstranitCONCAT()
, nepřidávat ho. - ano, rozumím tomu, jak zajistit kompatibilitu kódu s 2008 R2, že je triviální. Děkujeme za potvrzení, že k této funkci nelze
DENY
přistupovat. - Všimněte si při změně concat na + you ' Budu muset zajistit, aby hodnoty, které jsou zřetězeny, byly řetězce pro začátek, pokud máte nějaká numerická pole, pokusí se je přidat (a selže, protože řetězec není int), takže pokud existuje numerické pole (typ) make určitě jej nejprve převeďte / vhoďte na řetězec
odpověď
Funkci ODBC CONCAT můžete použít takto :
SELECT {fn CONCAT("foo ", "test") }
Problém je v tom, že tato funkce umožňuje pouze dva parametry včas. Pokud tedy nechcete použít více než dva takovéhle způsoby:
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
Možná také stačí použít operátor „+“.
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;