it-swarm-eu.dev

'CONCAT' není rozpoznaný integrovaný název funkce

Klient oznámil, že běží na serveru SQL Server 2012, a před testováním jsme však dodali několik testovacích dotazů:

'CONCAT' není rozpoznaný integrovaný název funkce.

Chápu, že CONCAT() je nová integrovaná funkce zavedená v SQL Server 2012, což je v pořádku a dobře, ale byl jsem požádán o vrácení své změny, aby byl tento 2008R2 kompatibilní pod rouškou „ uživatel provádějící dotaz nemusí mít k provedení oprávnění Transact-SQL. " Takže jen dokazuji svůj názor, že klient s největší pravděpodobností má v DEV nainstalovanou jinou verzi serveru SQL než v PROD.

Nemohu najít žádné informace o tom, jak konkrétně popřít SELECT/EXECUTE oprávnění pro vestavěné funkce skalární hodnoty, ale je to možné, a pokud ano, obdrží uživatel stále stejný text chyby?

27
beeks

CONCAT byl představen v SQL Server 2012; v systému SQL Server 2008 R2 neexistuje způsob, jak zajistit jeho fungování. Od dokumentace :

enter image description here

Neexistuje ani způsob, jak selhat v roce 2012+, a to ani s úrovní kompatibility. Takže nechte své lidi zkontrolovat SELECT @@VERSION; Na obou serverech; zjistíte, že pokud CONCAT selže, je to <11. Aby byl váš kód kompatibilní s předchozími verzemi, musíte použít standardní operátor zřetězení řetězce (+). Nevím, jak byste to udělali pomocí skalární funkce, pokud jste vždy nepoužívali přesný stejný počet vstupních řetězců a , které změníte váš kód pro použití dbo.CONCAT() namísto CONCAT() (budou existovat scénáře, na kterých záleží, plus pokud vaše funkce udělá cokoli, co nativní neudělá, chcete konzistentní chování, pokud/kdy vylepšit). Takže bych tento přístup nedoporučoval. Možná budete muset přidat manipulaci NULL a další drobné změny (není možné říci, jak přesně změnit stávající skript, pokud jej nevidíme).

21
Aaron Bertrand

Můžete použít funkci ODBC CONCAT) takto:

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

Problém je v tom, že tato funkce umožňuje současně pouze dva parametry. Pokud tedy nechcete používat více než dva takovéhle:

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

Můžete také použít operátor '+'.

4
bfs