【问题标题】:How do I use the CONCAT function in SQL Server 2008 R2?如何在 SQL Server 2008 R2 中使用 CONCAT 函数?
【发布时间】:2012-05-11 11:17:11
【问题描述】:

我在 SQL Server 2008 R2 中寻找 CONCAT 函数。我found the link for this function。但是当我使用这个函数时,它给出了以下错误:

消息 195,第 15 级,状态 10,第 7 行
'CONCAT' 不是可识别的内置函数名称。

CONCAT 函数是否存在于 SQL Server 2008 R2 中?

如果没有,如何在 SQL Server 2008 R2 中连接字符串?

【问题讨论】:

  • @Oded 我只是尝试执行 stmt - select concat('b', 'a')
  • @marc_s:文档确实有一些迹象表明它适用于 SQL Server 2012,但没有迹象表明 CONCAT 是 2012 年的
  • 它确实间接表明它是2012年的,但是页面的UI设计很糟糕。在旧版本中提供功能的页面上,您正在阅读的文档版本旁边有一个下拉菜单。如果您知道这一点,那么您就知道它仅适用于 2012 年。如果你不知道,你最终会陷入和 Mitesh 一样的境地。

标签: sql-server sql-server-2008 tsql


【解决方案1】:

仅出于完整性考虑 - 在 SQL 2008 中,您将使用加号 + 运算符来执行字符串连接。

看看MSDN reference 的示例代码。从 SQL 2012 开始,您可能希望使用新的CONCAT function

【讨论】:

    【解决方案2】:

    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)  
    

    编辑 Martin Smith 很有帮助地指出SQL Server provides an implementation of ODBC's CONCAT function

    【讨论】:

    • 您可以在以前的版本中使用SELECT {fn concat ('foo', 'bar')};。不过只接受 2 个参数。
    • 或者只是使用+ 运算符,正如@lynn-langit 在她的回答中提到的那样,我起初完全错过了,因为我只阅读了接受的答案......
    • @Svish + 的行为不同,SELECT 'A' + 'B' + 'C' vs SELECT CONCAT('A', 'B', 'C') vs SELECT 'A' + 'B' + NULL vs SELECT CONCAT('A', 'B', NULL) 的结果是 ABC, ABC, AB, @9876
    • @ta.speot.is 很高兴知道!虽然在我的情况下没有NULL 的情况,所以+ 工作得很好:)
    • 如果此答案包含您必须使用加号代替的信息,它将更加有用。社区确认了这一观点 - 比较 @LynnLangit 回答的赞成票 :) OP 问“我如何在 SQL Server 2008 R2 中连接字符串?”
    【解决方案3】:

    我建议你在连接它们之前转换所有列

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

    这应该适合你。

    【讨论】:

    • 提示:值得注意的是,如果未指定 varchar 大小,例如varchar(50),那么 sql 将使用默认值 30。如果要转换的变量/值大于默认值,则会被截断而不会引发错误。
    • 我知道为什么,但我花了一段时间才找到解决方案。就是你。
    【解决方案4】:

    如上所述,在 SQL Server 2012 之前不支持 CONCAT。但是您可以按照建议使用 + 运算符进行连接。但请注意,如果第一个操作数是数字,则此运算符将引发错误,因为它认为将添加而不是连接。要解决此问题,只需在前面添加“”。例如

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

    会引发错误,但'' + someNumber + 'someString' + ...... 可以正常工作。

    另外,如果要连接两个数字,请确保在它们之间添加一个'',就像这样

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

    【讨论】:

    • 谢谢,在列列表中使用 '' + f.columnName + '' 是一种享受!
    • @kuklei 在我的 SQL 服务器上,SELECT 'varchar(' + 5 + ')' 抛出错误“将 nvarchar 值 'varchar(' 转换为数据类型 int 时转换失败”,所以我猜你的答案不成立。
    【解决方案5】:

    SQL Server 2012 CONCAT 函数的替换近似值中的 NULL 安全下降

    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 发现的关于默认varchar 大小的潜在问题,此处由varchar(MAX) 解决。

    【讨论】:

      【解决方案6】:
      (city + ', ' + state + ' ' + zip) as ctstzip for select
      (city + ', ' + state + ' ' + zip) for insert
      

      仅当任何字段类型与其他字段类型不同时才强制转换或转换。

      插入时,值需要位于您需要插入的正确位置。使用“as”会报错。

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

      【讨论】:

        【解决方案7】:

        是的,该功能不在 sql 2008 中。您可以使用强制转换操作来做到这一点。

        例如,我们有employee 表,而您想要nameapplydate

        所以你可以使用

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

        它会在 concat 函数不工作的地方工作。

        【讨论】:

          【解决方案8】:

          您可以在要连接的字符串之间使用“+”

          SELECT string1 + string2
          

          如果其中之一给出转换错误,例如其中一列是 int 列,则应在连接列之前将其转换为

          SELECT (CONVERT(nvarchar, intColumn) + string2
          

          【讨论】:

            猜你喜欢
            • 2015-02-26
            • 2014-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多