' CONCAT ' não é um nome de função integrado reconhecido
On Fevereiro 17, 2021 by adminUm cliente relatou que estava executando no SQL Server 2012 e, no entanto, entregamos algumas consultas de teste para teste antes da entrega final:
” CONCAT “não é um nome de função integrado reconhecido.
Eu entendo que CONCAT()
é um novo -in função introduzida no SQL Server 2012, que está tudo bem e bem, no entanto, fui solicitado a reverter minha alteração para tornar este 2008R2 compatível com o disfarce de “o usuário que executa a consulta pode não ter permissões Transact-SQL para executar . ” Portanto, estou apenas provando meu ponto de vista que o cliente provavelmente tem uma versão diferente do SQL Server instalada no DEV e no PROD.
Não consigo encontrar nenhuma informação sobre como negar especificamente SELECT/EXECUTE
permissões para funções de valor escalar integradas, mas é possível, e se for o caso, o usuário ainda receberá o mesmo texto de erro?
Comentários
Resposta
CONCAT
foi apresentado no SQL Server 2012; não há como fazê-lo funcionar no SQL Server 2008 R2. Da documentação :
Também não há como fazê-la falhar em 2012+, mesmo com nível de compatibilidade. Portanto, peça que seu pessoal verifique SELECT @@VERSION;
em ambos os servidores; você descobrirá que onde CONCAT
falha, é < 11. Para tornar seu código compatível com versões anteriores, você precisará para usar o operador de concatenação de string padrão (+
). Não sei como você faria isso com uma função escalar, a menos que sempre use o mesmo número exato de strings de entrada e você altera seu código para usar dbo.CONCAT()
em vez de CONCAT()
(haverá cenários onde é importante, mais se sua função faz algo que o nativo não faz, você deseja um comportamento consistente se / quando você atualizar). Portanto, eu não recomendaria essa abordagem. Você também pode precisar adicionar NULL
manipulação e outras pequenas alterações (impossível dizer a você como alterar seu script existente exatamente, se não pudermos veja).
Comentários
- Obrigado, Aaron. O código é fácil de mudar, pois CONCAT () é usado apenas para juntar algumas strings antes de uma chamada de SQL dinâmica SP_ExecuteSQL. Eu realmente só queria confirmar que NÃO havia maneira de negar acesso ao uso de CONCAT () no SQL Server 2012
- @beeks eu não ' não conheço nenhum maneira de negar aos usuários a capacidade de usar
CONCAT()
, não. Eu não ' não entendo muito bem o que isso tem a ver com o que você precisa fazer para fazer o código funcionar no 2008 R2, no entanto. Você precisa removerCONCAT()
, não adicioná-lo. - sim, eu entendo como tornar o código compatível com 2008 R2, que é trivial. Obrigado por confirmar que não é possível
DENY
acessar esta função. - Apenas para observar quando alterar o concat para + você ' Vou precisar garantir que os valores sendo concatenados sejam strings para começar, se você tiver quaisquer campos numéricos, ele tentará adicioná-los (e falhará porque uma string não é um int), portanto, se houver um campo numérico (tipo), faça certifique-se de convertê-lo / convertê-lo em uma string primeiro
Resposta
Você pode usar a função ODBC CONCAT desta forma :
SELECT {fn CONCAT("foo ", "test") }
O problema com isso é que esta função permite apenas dois parâmetros de uma vez. Portanto, a menos que você queira usar mais de dois como este:
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
Você pode também é só usar o 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;