CONCAT işlevini SQL Server 2008 R2'de nasıl kullanırım?


102

CONCATSQL Server 2008 R2'de bir işlev arıyordum . Ben bu işlev için bağlantı buldu . Ancak bu işlevi kullandığımda şu hatayı veriyor:

Msg 195, Düzey 15, Durum 10, Satır 7
'CONCAT' tanınan bir yerleşik işlev adı değil.

Does CONCATfonksiyonu SQL Server 2008 R2 var?

Değilse, SQL Server 2008 R2'de dizeleri nasıl birleştirebilirim?


@Oded Sadece stmt'yi çalıştırmayı deniyorum - select concat ('b', 'a')
Mitesh Budhabhatti

1
@marc_s: Belgelerin SQL Server 2012 için olduğuna dair bazı göstergeler var, ancak 2012 CONCATiçin yeni olduğuna dair bir gösterge yok .
Gabe

1
Dolaylı olarak 2012 için olduğunu gösteriyor, ancak sayfanın zayıf UI tasarımı. Bir işlevin eski sürümlerde mevcut olduğu sayfalarda, okumakta olduğunuz dokümanın sürümünün hemen yanında bir açılır pencere vardır. Bunu biliyorsanız, bunun sadece 2012 için olduğunu da bilirsiniz. Eğer bilmiyorsanız, Mitesh ile aynı duruma düşersiniz.
John

Yanıtlar:


70

CONCATSQL Server 2012 için yenidir. Verdiğiniz bağlantı bunu açıkça ortaya koymaktadır, 2008 R2 dahil Önceki Sürümlerde bir işlev değildir .

SQL Server 2012'nin bir parçası olduğu belge ağacında görülebilir:

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)  

DÜZENLE Martin Smith, SQL Server'ın ODBC CONCATişlevinin bir uygulamasını sağladığını faydalı bir şekilde belirtir .


26
SELECT {fn concat ('foo', 'bar')};Önceki versiyonlarda kullanabilirsiniz . Yine de yalnızca 2 parametre kabul eder.
Martin Smith

6
Ya +da @ lynn-langit'in cevabında belirttiği gibi sadece operatörü kullanın, ilk başta sadece kabul edilen cevabı okuduğum için tamamen kaçırdım ...
Svish

7
@Svish +davranır da farklı sonuçları SELECT 'A' + 'B' + 'C'v SELECT CONCAT('A', 'B', 'C')v SELECT 'A' + 'B' + NULLv SELECT CONCAT('A', 'B', NULL)olan ABC, ABC, NULL,AB
ta.speot.is

@ ta.speot.is Bilmekte fayda var! Benim durumumda hiçbir vaka olmamasına rağmen NULL, bu yüzden +harika çalıştı :)
Svish

Bunun yerine artı işaretini kullanmanız gerektiği bilgisini içeriyorsa, bu cevap çok daha yararlı olacaktır. Topluluk bu görüşü onaylıyor - @ LynnLangit'in cevabının olumlu oylarını karşılaştırın :) OP ayrıca "SQL Server 2008 R2'de dizeleri nasıl birleştirebilirim?" Diye sordu.
Honza Zidek


46

Birleştirmeden önce tüm sütunları atmanızı öneririm

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

Bu sizin için çalışmalı.


6
İPUCU: Bir varchar boyutu belirtilmezse, örneğin varchar (50), o zaman sql'nin varsayılan 30'u kullanacağına dikkat etmek önemlidir. Eğer dönüştürülen değişken / değer varsayılandan daha fazlaysa, bir hata oluşturmadan kesilecektir.
Swifty

23

CONCAT, belirtildiği gibi, SQL Server 2012'den önce desteklenmez. Bununla birlikte, önerildiği gibi + operatörünü kullanarak basitçe birleştirebilirsiniz. Ancak dikkat edin, bu operatör, eğer ilk işlenen bir sayı ise, toplanacağını ve birleştirilmeyeceğini düşündüğü için bir hata atacaktır. Bu sorunu çözmek için önüne '' ekleyin. Örneğin

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

bir hata oluşturacak, ANCAK '' + someNumber + 'someString' + ......gayet iyi çalışacaktır.

Ayrıca, birleştirilecek iki numara varsa, aralarına bir '' eklediğinizden emin olun.

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

Teşekkürler, sütun listesinde '' + f.columnName + '' kullanmak bir zevktir!
Luke 13

2
@kuklei SQL sunucumda SELECT 'varchar(' + 5 + ')'"'varchar (' nvarchar değerini int veri türüne dönüştürürken dönüştürme başarısız oldu" hatası veriyor, bu yüzden cevabınız tutmuyor sanırım.
Alexander

5

SQL Server 2012 CONCAT işlevi için değiştirme yaklaşımlarında NULL güvenli düşüş

SQL Server 2012 :

SELECT CONCAT(data1, data2)

PRE SQL 2012 (İki Çözüm) :

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

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

Bu iki çözüm, @Martin Smith, @Svish ve @ vasin1987 dahil olmak üzere diğer posterler tarafından ortaya atılan birçok mükemmel cevabı ve uyarıları bir araya getiriyor.

Bu seçenekler , belirli işlenenlerle ilgili olarak operatörün değişen davranışını hesaba katarken güvenli işlem NULLiçin ''(boş dizgi) dönüştürmeye eklenir .NULL+

Not ODBC Scaler fonksiyon ise çözelti 2 bağımsız değişken ile sınırlıdır +operatör gerektiği gibi bir yaklaşım çok tartışmaya ölçeklenebilir.

Ayrıca @Swifty tarafından tanımlanan varsayılan boyutla ilgili olarak varcharburada çözülen olası soruna da dikkat edin varchar(MAX).


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

Yalnızca herhangi bir alan türü diğerlerinden farklıysa çevirin veya dönüştürün.

Ekleme sırasında değerin doğru noktada olması gerekir, bunun girilmesi gerekir. "Farklı" kullanmak size bir hata verecektir.

yani

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

2

Evet fonksiyon sql 2008'de değil. Bunu yapmak için cast işlemini kullanabilirsiniz.

Örneğin elimizdeki employeemasa ve istediğiniz nameile applydate.

yani kullanabilirsin

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

Concat işlevinin çalışmadığı yerlerde çalışacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.