Comment utiliser la fonction CONCAT dans SQL Server 2008 R2?


102

Je cherchais une CONCATfonction dans SQL Server 2008 R2. J'ai trouvé le lien pour cette fonction . Mais lorsque j'utilise cette fonction, cela donne l'erreur suivante:

Msg 195, niveau 15, état 10, ligne 7
«CONCAT» n'est pas un nom de fonction intégré reconnu.

La CONCATfonction existe- t-elle dans SQL Server 2008 R2?

Sinon, comment concaténer des chaînes dans SQL Server 2008 R2?


@Oded Je viens d'essayer d'exécuter le stmt - sélectionnez concat ('b', 'a')
Mitesh Budhabhatti

1
@marc_s: La documentation indique que c'est pour SQL Server 2012, mais rien n'indique que ce CONCATsoit nouveau pour 2012.
Gabe

1
Cela indique indirectement que c'est pour 2012, mais la page est mal conçue. Sur les pages où une fonction est disponible dans les anciennes versions, il y a une liste déroulante juste à côté de la version du document que vous lisez. Si vous le savez, vous savez que ce n'est que pour 2012. Si vous ne le saviez pas, vous vous retrouvez dans la même situation que Mitesh.
John

Réponses:


70

CONCATest une nouveauté de SQL Server 2012. Le lien que vous avez donné le montre clairement, ce n'est pas une fonction sur les versions précédentes , y compris 2008 R2.

Le fait qu'il fasse partie de SQL Server 2012 peut être vu dans l'arborescence du document:

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 souligne utilement que SQL Server fournit une implémentation de la CONCATfonction ODBC .


26
Vous pouvez utiliser SELECT {fn concat ('foo', 'bar')};dans les versions précédentes. N'accepte que 2 paramètres cependant.
Martin Smith

6
Ou utilisez simplement l' +opérateur, comme le mentionne @ lynn-langit dans sa réponse, ce que j'ai totalement manqué au début car je n'ai lu que la réponse acceptée ...
Svish

7
@Svish +se comporte différemment, les résultats pour SELECT 'A' + 'B' + 'C'vs SELECT CONCAT('A', 'B', 'C')vs SELECT 'A' + 'B' + NULLvs SELECT CONCAT('A', 'B', NULL)sont ABC, ABC, NULL,AB
ta.speot.is

@ ta.speot.is Bon à savoir! Bien que dans mon cas, il n'y ait eu aucun cas de NULL, donc +a très bien fonctionné :)
Svish

Cette réponse serait beaucoup plus utile si elle contenait les informations que vous devez utiliser le signe plus à la place. La communauté confirme cette opinion - comparez les votes positifs de la réponse de @ LynnLangit :) L'OP a également demandé "comment concaténer des chaînes dans SQL Server 2008 R2?"
Honza Zidek

101

Juste pour être complet - dans SQL 2008, vous utiliseriez l' +opérateur plus pour effectuer la concaténation de chaînes.

Jetez un œil à la référence MSDN avec un exemple de code. À partir de SQL 2012, vous souhaiterez peut-être utiliser la nouvelle fonction CONCAT .


46

Je vous suggère de lancer toutes les colonnes avant de les concater

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

Cela devrait fonctionner pour vous.


6
ASTUCE: il convient de noter que si une taille varchar n'est pas spécifiée, par exemple varchar (50), alors sql utilisera la valeur par défaut de 30. Si la variable / valeur en cours de conversion est supérieure à la valeur par défaut, elle sera tronquée sans générer d'erreur.
Swifty

23

CONCAT, comme indiqué, n'est pas pris en charge avant SQL Server 2012. Cependant, vous pouvez concaténer simplement en utilisant l'opérateur + comme suggéré. Mais attention, cet opérateur lèvera une erreur si le premier opérande est un nombre car il pense qu'il va ajouter et non concaténer. Pour résoudre ce problème, ajoutez simplement «» devant. Par exemple

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

générera une erreur MAIS '' + someNumber + 'someString' + ......fonctionnera très bien.

De plus, s'il y a deux nombres à concaténer, assurez-vous d'ajouter un '' entre eux, comme ceci

.... + someNumber + '' + someOtherNumber + .....

Merci d'utiliser '' + f.columnName + '' dans la liste des colonnes fonctionne un régal!
Luke

2
@kuklei Sur mon serveur SQL, SELECT 'varchar(' + 5 + ')'jette l'erreur "La conversion a échoué lors de la conversion de la valeur nvarchar 'varchar (' en type de données int", donc je suppose que votre réponse ne tient pas.
Alexander

5

Abandon sécurisé NULL dans les approximations de remplacement pour la fonction CONCAT de SQL Server 2012

SQL Server 2012 :

SELECT CONCAT(data1, data2)

PRE SQL 2012 (deux solutions) :

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

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

Ces deux solutions rassemblent plusieurs excellentes réponses et mises en garde soulevées par d'autres affiches, notamment @Martin Smith, @Svish et @ vasin1987.

Ces options s'ajoutent NULLà la ''conversion (chaîne vide) pour une NULLmanipulation sûre tout en tenant compte du comportement variable de l' +opérateur concernant des opérandes spécifiques.

Notez que la solution ODBC Scaler Function est limitée à 2 arguments alors que l' approche +opérateur est évolutive à de nombreux arguments selon les besoins.

Notez également le problème potentiel identifié par @Swifty concernant la varchartaille par défaut corrigée ici par varchar(MAX).


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

Ne cast ou convertir que si un type de champ est différent des autres.

Lors de l'insertion, la valeur doit être au bon endroit où vous devez l'insérer. L'utilisation de "as" vous donnera une erreur.

c'est à dire

Insert into testtable (ctstzip) Values ((city + ', ' + state + ' ' + zip))

2

Oui, la fonction n'est pas dans SQL 2008. Vous pouvez utiliser l'opération de conversion pour le faire.

Par exemple, nous avons une employeetable et vous voulez nameavec applydate.

afin que vous puissiez utiliser

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

Cela fonctionnera là où la fonction concat ne fonctionne pas.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.