Como uso a função CONCAT no SQL Server 2008 R2?

102

Eu estava procurando uma CONCATfunção no SQL Server 2008 R2. Eu encontrei o link para esta função . Mas quando uso essa função, ocorre o seguinte erro:

Msg 195, nível 15, estado 10, linha 7
'CONCAT' não é um nome de função interno reconhecido.

A CONCATfunção existe no SQL Server 2008 R2?

Se não, como concateno strings no SQL Server 2008 R2?

Mitesh Budhabhatti
fonte
@Oded acabei de tentar executar o stmt - select concat ('b', 'a')
Mitesh Budhabhatti
1
@marc_s: A documentação tem alguma indicação de que é para SQL Server 2012, mas não há nenhuma indicação de que CONCATseja nova para 2012.
Gabe
1
Indica indiretamente que é para 2012, mas a página tem um design de interface de usuário ruim. Nas páginas em que uma função ESTÁ disponível em versões mais antigas, há uma lista suspensa diretamente ao lado da versão do documento que você está lendo. Se você sabe disso, sabe que é apenas para 2012. Se você não sabia, você terminaria na mesma situação que Mitesh.
John,

Respostas:

70

CONCATé novo no SQL Server 2012. O link que você forneceu deixa isso claro, não é uma função nas versões anteriores , incluindo 2008 R2.

Que faz parte do SQL Server 2012 pode ser visto na árvore do documento:

SQL Server 2012  
Product Documentation  
Books Online for SQL Server 2012  
Database Engine  
  Transact-SQL Reference (Database Engine)  
    Built-in Functions (Transact-SQL)  
      String Functions (Transact-SQL)  

EDIT Martin Smith destaca que o SQL Server fornece uma implementação da CONCATfunção ODBC .

ta.speot.is
fonte
26
Você pode usar SELECT {fn concat ('foo', 'bar')};em versões anteriores. Só aceita 2 parâmetros.
Martin Smith
6
Ou apenas use a +operadora, como @ lynn-langit menciona em sua resposta, que eu a princípio perdi totalmente porque só li a resposta aceita ...
Svish
7
@Svish +se comporta de forma diferente, os resultados para SELECT 'A' + 'B' + 'C'vs SELECT CONCAT('A', 'B', 'C')vs SELECT 'A' + 'B' + NULLvs SELECT CONCAT('A', 'B', NULL)são ABC, ABC, NULL,AB
ta.speot.is
@ ta.speot.is É bom saber! Embora no meu caso não tenha havido casos de NULL, então +funcionou muito bem :)
Svish
Essa resposta seria muito mais útil se contivesse as informações de que você precisa para usar o sinal de mais. A comunidade confirma essa opinião - compare os votos positivos da resposta do @LynnLangit :) O OP perguntou também "como concateno strings no SQL Server 2008 R2?"
Honza Zidek
101

Apenas para completar - no SQL 2008, você usaria o +operador mais para realizar a concatenação de strings.

Dê uma olhada na referência do MSDN com código de exemplo. A partir do SQL 2012, você pode querer usar a nova função CONCAT .

Lynn Langit
fonte
46

Eu sugiro que você lance todas as colunas antes de concatá-las

cast('data1' as varchar) + cast('data2' as varchar) + cast('data3' as varchar)

Isso deve funcionar para você.

vasin1987
fonte
6
DICA: É importante notar que se um tamanho de varchar não for especificado, por exemplo, varchar (50), então sql usará o padrão de 30. Se a variável / valor sendo convertido for maior do que o padrão, ele será truncado sem gerar um erro.
Swifty de
23

CONCAT, conforme declarado, não tem suporte antes do SQL Server 2012. No entanto, você pode concatenar simplesmente usando o operador + conforme sugerido. Mas cuidado, este operador lançará um erro se o primeiro operando for um número, pois ele pensa que estará adicionando e não concatenando. Para resolver esse problema, basta adicionar '' na frente. Por exemplo

someNumber + 'someString' + .... + lastVariableToConcatenate

irá gerar um erro, MAS '' + someNumber + 'someString' + ......funcionará bem.

Além disso, se houver dois números a serem concatenados, certifique-se de adicionar um '' entre eles, como

.... + someNumber + '' + someOtherNumber + .....
Kuklei
fonte
Obrigado, usar '' + f.columnName + '' na lista de colunas funciona muito bem!
Lucas
2
@kuklei No meu servidor SQL, SELECT 'varchar(' + 5 + ')'gera o erro "A conversão falhou ao converter o valor nvarchar 'varchar (' para o tipo de dados int", então acho que sua resposta não se sustenta.
Alexander
5

NULL safe drop nas aproximações de substituição para a função CONCAT do SQL Server 2012

SQL Server 2012 :

SELECT CONCAT(data1, data2)

PRE SQL 2012 (duas soluções) :

SELECT {fn CONCAT(ISNULL(data1, ''), ISNULL(data2, ''))}

SELECT ISNULL(CAST(data1 AS varchar(MAX)), '') + ISNULL(CAST(data2 AS varchar(MAX)), '')

Essas duas soluções reúnem várias respostas excelentes e advertências levantadas por outros participantes, incluindo @Martin Smith, @Svish e @ vasin1987.

Essas opções somam-se NULLà ''conversão (string vazia) para NULLmanuseio seguro enquanto leva em consideração o comportamento variável do +operador em relação a operandos específicos.

Observe que a solução ODBC Scaler Function é limitada a 2 argumentos, enquanto a abordagem do +operador é escalonável para muitos argumentos conforme necessário.

Observe também o possível problema identificado por @Swifty em relação ao varchartamanho padrão aqui corrigido por varchar(MAX).

Troy Sheaffer
fonte
3
(city + ', ' + state + ' ' + zip) as ctstzip for select
(city + ', ' + state + ' ' + zip) for insert

Apenas lançar ou converter se algum tipo de campo for diferente dos outros.

Ao inserir o valor precisa estar no local correto em que você precisa que ele seja inserido. Usar "como" gerará um erro.

ie

Insert into testtable (ctstzip) Values ((city + ', ' + state + ' ' + zip))
Antonio Perez
fonte
2

Sim, a função não está no sql 2008. Você pode usar a operação de conversão para fazer isso.

Por exemplo, temos employeemesa e você quer namecom applydate.

então você pode usar

Select   cast(name as varchar) + cast(applydate as varchar) from employee

Ele funcionará onde a função concat não estiver funcionando.

M Faisal SE
fonte