' CONCAT ' no es un nombre de función integrado reconocido
On febrero 17, 2021 by adminUn cliente informó que se estaba ejecutando en SQL Server 2012 y entregamos algunas consultas de prueba para probar antes de una entrega final, sin embargo:
» CONCAT «no es un nombre de función integrado reconocido.
Entiendo que CONCAT()
es una nueva -en la función introducida en SQL Server 2012, que está muy bien, sin embargo, se me pidió que revertiera mi cambio para que este 2008R2 sea compatible con el pretexto de que «el usuario que ejecuta la consulta puede no tener 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 negar específicamente SELECT/EXECUTE
permisos para funciones integradas con valores escalares, pero ¿es posible? Si es así, ¿el usuario sigue recibiendo el mismo texto de error?
Comentarios
Respuesta
CONCAT
fue introducido en SQL Server 2012; no hay forma de que funcione en SQL Server 2008 R2. De la documentación :
Tampoco hay forma de hacer que falle en 2012+, incluso con el nivel de compatibilidad. Así que haga que su gente revise SELECT @@VERSION;
en ambos servidores; encontrará que donde CONCAT
falla es < 11. Para que su código sea compatible con versiones anteriores, necesitará para utilizar 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 haya usado el mismo número exacto de cadenas de entrada y cambia su código para usar dbo.CONCAT()
en lugar de CONCAT()
(habrá situaciones en las que importa, además si su función hace algo que el nativo no hace, desea un comportamiento consistente si / cuando actualiza). Por lo tanto, no recomendaría ese enfoque. Es posible que también deba agregar el manejo de NULL
y otros cambios menores (es imposible decirle cómo cambiar su secuencia de comandos existente exactamente, si no podemos verlo).
Comentarios
- Gracias, Aaron. Es trivial cambiar el código, ya que CONCAT () solo se usa para unir algunas cadenas antes de una llamada SQL dinámica SP_ExecuteSQL. Realmente solo quería confirmar que NO había forma de denegar el acceso al uso de CONCAT () en SQL Server 2012
- @beeks No ' no conozco forma de negar a los usuarios la capacidad de usar
CONCAT()
, no. No obstante, ' no sigo del todo qué relación tiene eso con lo que debe hacer para que el código funcione en 2008 R2. Necesita eliminarCONCAT()
, no agregarlo. - Sí, entiendo cómo hacer que el código sea compatible con 2008 R2, que es trivial. Gracias por confirmar que no se puede
DENY
acceder a esta función. - Solo para tener en cuenta al cambiar la concat a + you ' tendremos que asegurarnos de que los valores que se concatenan sean cadenas para empezar, si tiene algún campo numérico, intentará agregarlo (y fallará porque una cadena no es un int) así que si hay un campo numérico (tipo) haga asegúrese de convertirlo / convertirlo en una cadena primero
Responder
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 permite dos parámetros a la vez. Por tanto, a menos que desee utilizar más de dos como este:
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
Puede también utilice el operador «+».
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;