'CONCAT' non è un nome di funzione incorporato riconosciuto


24

Un client ha riferito di essere in esecuzione su SQL Server 2012 e abbiamo inviato alcune query di test per i test prima di un recapito finale, tuttavia:

'CONCAT' non è un nome di funzione incorporato riconosciuto.

Comprendo che si CONCAT()tratta di una nuova funzione integrata introdotta in SQL Server 2012, che va bene e va bene, tuttavia mi è stato chiesto di ripristinare la mia modifica per rendere compatibile questo 2008R2 con il pretesto di "l'utente che esegue la query potrebbe non disporre delle autorizzazioni Transact-SQL da eseguire. " Quindi sto solo dimostrando il mio punto che molto probabilmente il client ha una versione diversa di SQL Server installata in DEV rispetto a loro in PROD.

Non riesco a trovare alcuna informazione sulla negazione specifica delle SELECT/EXECUTEautorizzazioni per le funzioni scalare integrate, ma è possibile e in tal caso l'utente riceve ancora lo stesso testo di errore?


Se concat non funziona, prova questoSELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
Nilachal Sethi,

CONCAT supporta il tipo decimale concat (ID + '_' + OtherID), ID può essere di tipo int.
Zhang,

Nelle versioni precedenti, utilizzare questo invece:DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Jack Whittaker

Risposte:


21

CONCATè stato introdotto in SQL Server 2012; non c'è modo di farlo funzionare in SQL Server 2008 R2. Dalla documentazione :

inserisci qui la descrizione dell'immagine

Inoltre, non c'è modo di farlo fallire nel 2012+, anche con un livello di compatibilità. Quindi fai controllare la tua gente SELECT @@VERSION;su entrambi i server; troverai che dove CONCATfallisce è <11. Per rendere il tuo codice compatibile con le versioni precedenti, dovrai usare l'operatore di concatenazione di stringhe standard ( +). Non so come lo faresti con una funzione scalare, a meno che tu non abbia sempre usato lo stesso numero esatto di stringhe di input e cambi il codice da utilizzare dbo.CONCAT()invece di CONCAT()(ci saranno scenari in cui è importante, inoltre se la tua funzione fa qualcosa il nativo non lo fa, si desidera un comportamento coerente se / quando si aggiorna). Quindi non consiglierei questo approccio. Potrebbe anche essere necessario aggiungereNULL gestione e altre modifiche minori (impossibile dirti come modificare esattamente lo script esistente, se non riusciamo a vederlo).


Grazie Aaron. Il codice è banale da modificare, poiché CONCAT () viene usato solo per unire alcune stringhe prima di una chiamata SQL dinamica SP_ExecuteSQL. Volevo solo confermare che non c'era modo di negare l'accesso all'uso di CONCAT () in SQL Server 2012
beeks,

1
@beeks Non conosco alcun modo per negare agli utenti la possibilità di utilizzare CONCAT(), no. Tuttavia, non seguo esattamente ciò che ha a che fare con ciò che è necessario fare per far funzionare il codice su 2008 R2. Devi rimuovere CONCAT() , non aggiungerlo.
Aaron Bertrand

1
sì, capisco come rendere compatibile il codice con 2008 R2, è banale. Grazie per aver confermato che non è possibile DENYaccedere a questa funzione.
beeks

Solo per notare quando si modifica il concat in + è necessario assicurarsi che i valori in fase di concatenazione siano stringhe con cui iniziare, se si dispone di campi numerici, si proverà ad aggiungerli (e fallirà perché una stringa non è un int) quindi se c'è un campo numerico (tipo) assicurati di convertirlo / lanciarlo prima in una stringa
Ste Bov,

3

È possibile utilizzare la funzione CONCAT ODBC in questo modo:

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

Il problema è che questa funzione consente solo due parametri alla volta. Quindi, a meno che tu non voglia usarne più di due in questo modo:

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

Potresti anche usare l'operatore '+'.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.