ฉันจะใช้ฟังก์ชัน CONCAT ใน SQL Server 2008 R2 ได้อย่างไร


102

ฉันกำลังมองหาCONCATฟังก์ชันใน SQL Server 2008 R2 ฉันพบลิงค์สำหรับฟังก์ชันนี้ แต่เมื่อฉันใช้ฟังก์ชันนี้จะมีข้อผิดพลาดดังต่อไปนี้:

ข่าวสารเกี่ยวกับ 195 ระดับ 15 สถานะ 10 บรรทัด 7
'CONCAT' ไม่ใช่ชื่อฟังก์ชันในตัวที่รู้จัก

ไม่CONCATฟังก์ชั่นที่มีอยู่ใน SQL Server 2008 R2?

ถ้าไม่ฉันจะเชื่อมสตริงใน SQL Server 2008 R2 ได้อย่างไร


@Oded ฉันแค่ลองรัน stmt - เลือก concat ('b', 'a')
Mitesh Budhabhatti

1
@marc_s: เอกสารนี้มีข้อบ่งชี้บางประการว่าเป็นของ SQL Server 2012 แต่ไม่มีข้อบ่งชี้ว่าCONCATเป็นของใหม่สำหรับปี 2012
Gabe

1
มันบ่งบอกทางอ้อมว่าเป็นปี 2012 แต่หน้านั้นออกแบบ UI ได้ไม่ดี ในหน้าที่มีฟังก์ชัน IS ในเวอร์ชันเก่าจะมีรายการแบบเลื่อนลงถัดจากเวอร์ชันของเอกสารที่คุณกำลังอ่านอยู่ ถ้าคุณรู้สิ่งนี้คุณก็รู้ว่าสำหรับปี 2012 เท่านั้น ถ้าคุณไม่รู้คุณก็จะอยู่ในสถานการณ์เดียวกันกับ Mitesh
John

คำตอบ:


70

CONCATเป็นของใหม่สำหรับ SQL Server 2012 ลิงก์ที่คุณให้ไว้ทำให้ชัดเจนไม่ใช่ฟังก์ชันในเวอร์ชันก่อนหน้ารวมถึง 2008 R2

เป็นส่วนหนึ่งของ SQL Server 2012 สามารถดูได้ในโครงสร้างเอกสาร:

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)  

แก้ไขมาร์ตินสมิ ธ เป็นประโยชน์ชี้ให้เห็นว่าSQL Server ให้การดำเนินการของ ODBC ของCONCATฟังก์ชั่น


26
คุณสามารถใช้SELECT {fn concat ('foo', 'bar')};ในเวอร์ชันก่อนหน้านี้ ยอมรับเพียง 2 พารามิเตอร์เท่านั้น
Martin Smith

6
หรือเพียงแค่ใช้ตัว+ดำเนินการตามที่ @ lynn-langit พูดถึงในคำตอบของเธอซึ่งตอนแรกฉันพลาดไปเพราะอ่านเฉพาะคำตอบที่ยอมรับเท่านั้น ...
Svish

7
@Svish +ทำงานแตกต่างกัน, ผลสำหรับSELECT 'A' + 'B' + 'C'VS SELECT CONCAT('A', 'B', 'C')VS SELECT 'A' + 'B' + NULLVS SELECT CONCAT('A', 'B', NULL)มีABC, ABC, NULL,AB
ta.speot.is

@ ta.speot.is น่ารู้! แม้ว่าในกรณีของฉันจะไม่มีกรณีNULLแต่ก็ทำได้+ดีมาก :)
Svish

คำตอบนี้จะมีประโยชน์มากขึ้นหากมีข้อมูลที่คุณต้องใช้เครื่องหมายบวกแทน ยืนยันของชุมชนที่มีความคิดเห็นที่ - เทียบ upvotes ของ @ คำตอบของ LynnLangit :) สหกรณ์ถามยัง "ฉันจะ concatenate สตริงใน SQL Server 2008 R2?"
Honza Zidek

101

เพื่อความสมบูรณ์ - ใน SQL 2008 คุณจะใช้ตัว+ดำเนินการบวกเพื่อทำการต่อสายอักขระ

ดูข้อมูลอ้างอิง MSDNพร้อมโค้ดตัวอย่าง เริ่มต้นด้วย SQL 2012, คุณอาจต้องการที่จะใช้ใหม่ฟังก์ชั่น CONCAT


46

ฉันขอแนะนำให้คุณแคสต์คอลัมน์ทั้งหมดก่อนที่จะเชื่อมต่อ

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

สิ่งนี้ควรได้ผลสำหรับคุณ


6
เคล็ดลับ: เป็นที่น่าสังเกตว่าหากไม่ระบุขนาด varchar เช่น varchar (50) ดังนั้น sql จะใช้ค่าเริ่มต้นเป็น 30 หากตัวแปร / ค่าที่ร่ายมากกว่าค่าเริ่มต้นจะถูกตัดทอนโดยไม่ทำให้เกิดข้อผิดพลาด
Swifty

23

CONCAT ตามที่ระบุไว้ไม่ได้รับการสนับสนุนก่อน SQL Server 2012 อย่างไรก็ตามคุณสามารถเชื่อมต่อได้โดยใช้ตัวดำเนินการ + ตามที่แนะนำ แต่ระวังตัวดำเนินการนี้จะแสดงข้อผิดพลาดหากตัวถูกดำเนินการตัวแรกเป็นตัวเลขเนื่องจากคิดว่าจะเพิ่มและไม่เชื่อมต่อกัน หากต้องการแก้ไขปัญหานี้ให้เพิ่ม "" ไว้ด้านหน้า ตัวอย่างเช่น

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

จะเพิ่มข้อผิดพลาด แต่'' + someNumber + 'someString' + ......จะทำงานได้ดี

นอกจากนี้หากมีสองตัวเลขที่จะเชื่อมต่อกันให้แน่ใจว่าคุณได้เพิ่ม '' ระหว่างพวกเขาเช่นนั้น

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

ขอขอบคุณการใช้ '' + f.columnName + '' ในรายการคอลัมน์จะช่วยได้มาก!
Luke

2
@kuklei บนเซิร์ฟเวอร์ SQL ของฉันSELECT 'varchar(' + 5 + ')'แสดงข้อผิดพลาด "การแปลงล้มเหลวเมื่อแปลงค่า nvarchar" varchar ("เป็นประเภทข้อมูล int" ดังนั้นฉันเดาว่าคำตอบของคุณไม่ได้รับการตอบสนอง
Alexander

5

NULL ปลอดภัยลดลงในการประมาณค่าทดแทนสำหรับฟังก์ชัน SQL Server 2012 CONCAT

SQL Server 2012 :

SELECT CONCAT(data1, data2)

PRE SQL 2012 (สองโซลูชัน) :

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

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

โซลูชันทั้งสองนี้รวบรวมคำตอบและคำเตือนที่ยอดเยี่ยมหลายประการจากผู้โพสต์อื่น ๆ เช่น @Martin Smith, @Svish และ @ vasin1987

ตัวเลือกเหล่านี้เพิ่มNULLในการแคสต์''(สตริงว่าง) เพื่อการNULLจัดการที่ปลอดภัยในขณะที่บัญชีสำหรับพฤติกรรมที่แตกต่างกันของไฟล์+ดำเนินการที่เกี่ยวข้องกับตัวถูกดำเนินการเฉพาะ

โปรดทราบว่าโซลูชันODBC Scaler Functionถูก จำกัด ไว้ที่ 2 อาร์กิวเมนต์ในขณะที่แนวทาง+ตัวดำเนินการสามารถปรับขนาดได้หลายอาร์กิวเมนต์ตามต้องการ

ยังทราบถึงปัญหาที่อาจเกิดขึ้นโดยระบุว่า @Swifty เกี่ยวกับการเริ่มต้นขนาดนี่แก้ไขได้โดยการvarcharvarchar(MAX)


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

แคสต์หรือแปลงเฉพาะเมื่อประเภทฟิลด์ใด ๆ แตกต่างจากประเภทอื่น

ในการแทรกค่าจะต้องอยู่ในจุดที่ถูกต้องที่คุณต้องใส่ การใช้ "เป็น" จะทำให้คุณมีข้อผิดพลาด

กล่าวคือ

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

2

ใช่ฟังก์ชันไม่ได้อยู่ใน sql 2008 คุณสามารถใช้การดำเนินการแคสต์เพื่อทำสิ่งนั้นได้

ตัวอย่างเช่นเรามีemployeeตารางและคุณต้องการด้วยnameapplydate

เพื่อให้คุณสามารถใช้

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

มันจะทำงานโดยที่ฟังก์ชัน concat ไม่ทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.