'CONCAT' não é um nome de função incorporado reconhecido

24

Um cliente relatou que eles estavam em execução no SQL Server 2012 e, no entanto, entregamos algumas consultas de teste antes da entrega final:

'CONCAT' não é um nome de função incorporado reconhecido.

Entendo que essa CONCAT()é uma nova função interna introduzida no SQL Server 2012, que está ótima e bem, no entanto, fui solicitado a reverter minha alteração para tornar este 2008R2 compatível sob o pretexto de "o usuário que está executando a consulta não pode tem permissões Transact-SQL para executar. " Portanto, estou apenas demonstrando 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 SELECT/EXECUTEpermissões especificamente para funções com valor escalar interno, mas é possível? Em caso afirmativo, o usuário ainda recebe o mesmo texto de erro?

Beeks
fonte
Se concat não estiver funcionando, tente esteSELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
Nilachal Sethi 2/18/18
CONCAT suporta o tipo decimal concat (ID + '_' + OtherID), o ID pode ser do tipo int.
Zhang
Nas versões mais antigas, use-o:DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Jack Whittaker

Respostas:

21

CONCATfoi introduzido no SQL Server 2012; não há como fazê-lo funcionar no SQL Server 2008 R2. A partir da documentação :

insira a descrição da imagem aqui

Também não há como fazê-lo falhar em 2012 ou mais, mesmo com o nível de compatibilidade. Portanto, seu pessoal deve verificar SELECT @@VERSION;nos dois servidores; você descobrirá que onde CONCATfalha é <11. Para tornar seu código compatível com versões anteriores, você precisará usar o operador de concatenação de cadeias padrão ( +). Eu não sei como você faria isso com uma função escalar, a menos que você sempre usasse exatamente o mesmo número de cadeias de entrada e alterasse seu código para usar em dbo.CONCAT()vez de CONCAT()(haverá cenários onde isso importa, mais se sua função fizer alguma coisa o nativo não funciona, você deseja um comportamento consistente se / quando atualizar). Então, eu não recomendaria essa abordagem. Você também pode precisar adicionarNULL manipulação e outras pequenas alterações (impossível dizer exatamente como alterar seu script existente exatamente, se não conseguimos vê-lo).

Aaron Bertrand
fonte
Obrigado Aaron. O código é fácil de alterar, pois CONCAT () é usado apenas para juntar algumas cadeias antes de uma chamada SQL dinâmica SP_ExecuteSQL. Eu realmente só queria confirmar que não havia maneira de negar o acesso ao uso de CONCAT () no SQL Server 2012
Beeks
1
@ Semanas Eu não conheço nenhuma maneira de negar aos usuários a capacidade de usar CONCAT(), não. No entanto, não entendo exatamente o que isso tem a ver com o que você precisa fazer para que o código funcione no 2008 R2. Você precisa remover CONCAT() , não adicioná-lo.
Aaron Bertrand
1
sim, eu entendo como tornar o código compatível com o 2008 R2, isso é trivial. Obrigado por confirmar que não é possível DENYacessar esta função.
beeks
Apenas para observar ao alterar a concat para o +, você precisará garantir que os valores que estão sendo concatenados sejam sequências de caracteres, se você tiver algum campo numérico, ele tentará adicioná-los (e falhará porque uma sequência não é um int), portanto, se há um campo numérico (tipo) certifique-se de converter / lançá-lo para uma string primeiro
Ste Bov
3

Você pode usar a função ODBC CONCAT assim:

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

O problema é que essa função permite apenas dois parâmetros por vez. Portanto, a menos que você queira usar mais de dois como este:

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

Você também pode usar o operador '+'.

bfs
fonte