'CONCAT' no es un nombre de función incorporado reconocido

24

Sin embargo, un cliente informó que se estaba ejecutando en SQL Server 2012, y entregamos algunas consultas de prueba antes de una entrega final:

'CONCAT' no es un nombre de función incorporado reconocido.

Entiendo que CONCAT()es una nueva función incorporada introducida en SQL Server 2012, que está muy bien, sin embargo, se me ha pedido que revierta mi cambio para hacer que este 2008R2 sea compatible bajo la apariencia de "el usuario que ejecuta la consulta no puede tiene permisos de Transact-SQL para ejecutar ". Así que solo estoy demostrando mi punto de que el cliente probablemente tenga una versión diferente de SQL Server instalada en DEV que en PROD.

No puedo encontrar ninguna información sobre la denegación específica de SELECT/EXECUTEpermisos para funciones de valor escalar incorporadas, pero ¿es posible, y si es así, el usuario sigue recibiendo el mismo texto de error?

pitidos
fuente
Si concat no funciona, pruebe esteSELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
Nilachal Sethi,
CONCAT admite el tipo decimal concat (ID + '_' + OtherID), el ID puede ser de tipo int.
Zhang
En versiones anteriores, use esto en su lugar:DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Jack Whittaker

Respuestas:

21

CONCATfue introducido en SQL Server 2012; no hay forma de hacerlo funcionar en SQL Server 2008 R2. De la documentación :

ingrese la descripción de la imagen aquí

Tampoco hay forma de hacerlo fallar en 2012+, incluso con el nivel de compatibilidad. Así que haga que su gente verifique SELECT @@VERSION;en ambos servidores; encontrará que donde CONCATfalla es <11. Para que su código sea compatible con versiones anteriores, deberá usar el operador de concatenación de cadenas estándar ( +). No sé cómo haría esto con una función escalar, a menos que siempre use exactamente la misma cantidad de cadenas de entrada y cambie su código para usar en dbo.CONCAT()lugar de CONCAT()(habrá escenarios donde sea importante, además si su función hace algo el nativo no lo hace, desea un comportamiento consistente si / cuando actualiza). Entonces no recomendaría ese enfoque. Es posible que también deba agregarNULL manejo y otros cambios menores (imposible decirle cómo cambiar su script existente exactamente, si no podemos verlo).

Aaron Bertrand
fuente
Gracias Aaron. El código es trivial para cambiar, ya que CONCAT () se usa para unir algunas cadenas antes de una llamada SQL dinámica SP_ExecuteSQL. Realmente sólo quería confirmar que no había manera de negar el acceso a la utilización de CONCAT () en SQL Server 2012
Beeks
1
@beeks No conozco ninguna forma de negar a los usuarios la capacidad de usar CONCAT(), no. Sin embargo, no entiendo qué relación tiene con lo que debe hacer para que el código funcione en 2008 R2. Necesita eliminar CONCAT() , no agregarlo.
Aaron Bertrand
1
Sí, entiendo cómo hacer que el código sea compatible con 2008 R2, eso es trivial. Gracias por confirmar que no se puede DENYacceder a esta función.
suena
Solo para tener en cuenta que al cambiar el concat a +, deberá asegurarse de que los valores que se concatenan sean cadenas para comenzar, si tiene campos numéricos, intentará agregarlos (y fallará porque una cadena no es un int), por lo que si hay un campo numérico (tipo), asegúrese de convertirlo / convertirlo en una cadena primero
Ste Bov
3

Puede usar la función ODBC CONCAT de esta manera:

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

El problema con esto es que esta función solo le permite dos parámetros a la vez. Entonces, a menos que quiera usar más de dos como este:

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

También podría usar el operador '+'.

bfs
fuente