15

在 SQL Server 2012 中,我想将concat5 列分为 1,但在查询中它可以工作,但是当我放入视图时,它会给我一个错误,例如

消息 174,级别 15,状态 1,第 3 行
CONCAT 函数需要 2 个参数。

有什么问题,所以我可以修复它,因为它对于超过 1 列来说concat是一个很好的功能,因为如果它为空,它们会使其为空..concatenate

代码:

SELECT        
   'Aan ' + A.Name AS 'Naam', 
   { fn CONCAT('T.a.v. ', C.Salutation + ' ', C.FirstName + ' ', C.MiddleName + ' ', C.LastName) } AS 'T.a.v.',   
   ISNULL(ISNULL(A.Address1_Line2, A.Address1_Line1), 
   C.Address1_Line2) AS 'Adres', 
   ISNULL(A.Address1_PostalCode + ' ' + A.Address1_City, A.Address2_PostalCode + ' ' + A.Address2_City) AS 'Woonplaats',
   'heer' + ' ' + ISNULL(C.MiddleName + ' ', N'') + ISNULL(C.LastName, N'') AS 'Aanhef'  
FROM            
    dbo.Account AS A 
FULL OUTER JOIN  
    dbo.Contact AS C ON A.Name = C.AccountIdName  
WHERE 
    (C.Salutation = 'Dhr.') AND (A.Name IS NOT NULL) AND (A.StatusCode = 1) 
    AND (ISNULL(C.StatusCode, 1) = 1) OR (C.Salutation = 'dhr.') AND (A.Name IS NOT NULL) AND (A.StatusCode = 1) AND (ISNULL(C.StatusCode, 1) = 1)     
4

8 回答 8

15

海。如果您想将 CONCAT 作为规范函数 {fn CONCAT(...)} 使用到视图设计器中,则有一种解决方案可以连接两个以上的列/字符。

您可以像这样在 CONCAT 中使用 CONCAT:

假设您想将两个代码连接成一个代码,中间用“-”

列 1 = 123456

列 2 = 0001

{fn CONCAT({fn CONCAT(column1, '-')}, column2)}

因此,您将拥有:123456-0001

于 2015-04-30T14:34:22.823 回答
9

您认为其他地方一定有错误!

好的,那么我对您的代码所做的就是更改这一行

{ fn CONCAT('T.a.v. ', C.Salutation + ' ', C.FirstName + ' ', C.MiddleName + ' ', C.LastName) } AS 'T.a.v.'

对此

CONCAT('T.a.v. ', C.Salutation + ' ', C.FirstName + ' ', C.MiddleName + ' ', C.LastName) AS 'T.a.v.'

编辑:

只是为了解释代码中的差异,带有 { fn ....} 的那个是一个规范函数,微软承诺它将适用于所有 ODBC 连接。

来自 MSDN:

规范函数是所有数据提供者都支持的函数,可以被所有查询技术使用。提供者不能扩展规范函数。

于 2013-05-15T14:13:11.627 回答
5

我遇到了同样的问题,所有其他答案都对我不起作用,我不想使用 Andrei 的答案。

我设法使用创建视图语句创建视图。

CREATE VIEW ViewName AS
SELECT        
   'Aan ' + A.Name AS 'Naam', 
   { fn CONCAT('T.a.v. ', C.Salutation + ' ', C.FirstName + ' ', C.MiddleName + ' ', C.LastName) } AS 'T.a.v.',   
   ISNULL(ISNULL(A.Address1_Line2, A.Address1_Line1), 
   C.Address1_Line2) AS 'Adres', 
   ISNULL(A.Address1_PostalCode + ' ' + A.Address1_City,     A.Address2_PostalCode + ' ' + A.Address2_City) AS 'Woonplaats',
   'heer' + ' ' + ISNULL(C.MiddleName + ' ', N'') + ISNULL(C.LastName, N'') AS 'Aanhef'  
FROM dbo.Account AS A 
FULL OUTER JOIN  
    dbo.Contact AS C ON A.Name = C.AccountIdName  
WHERE 
    (C.Salutation = 'Dhr.') AND (A.Name IS NOT NULL) AND (A.StatusCode = 1) 
    AND (ISNULL(C.StatusCode, 1) = 1) OR (C.Salutation = 'dhr.') AND (A.Name IS NOT NULL) AND (A.StatusCode = 1) AND (ISNULL(C.StatusCode, 1) = 1)  
于 2017-03-29T07:34:27.450 回答
2

使用CONCAT_WS而不是CONCAT. 即使您在 SSMS 的设计模式下使用它,它也会在视图中保持不变,并且您可以使用它指定一个不会附加在字符串末尾的字符串分隔符。

例子:

select CONCAT_WS('; ',NULL,'Frank',NULL,'Mary')

结果将是Frank; Mary

于 2020-04-03T18:59:48.260 回答
2

我得到了同样的错误。以下是它是如何发生的。我在 SQL Server (2014) Management Studio 中使用了查询/视图生成器。我键入了函数“CONCAT (...”,但它把它转换为“{fn CONCAT(...)}”。然后我得到了错误,尽管有多个项目。

我摆脱了“{fn ... }”并且效果很好。

于 2015-08-01T05:34:37.597 回答
0

在视图 SQL Server 中创建 CONCAT FUNCTION必须需要 2 个参数。所以你可以试试这个:

SELECT
concat(
    concat('T.a.v. ', C.Salutation + ' '), 
    concat(C.FirstName + ' ', concat(C.MiddleName + ' ', C.LastName)) 
)  AS 'T.a.v.'
于 2019-12-09T08:17:52.737 回答
0

对我来说效果很好! 从 myview 中选择 (column1 + column2 + column3) 作为 myconcat 而不是 {fn CONCAT({fn CONCAT(column1, '-')}, column2)}

于 2020-01-04T03:34:28.927 回答
-1

当我想使用设计器创建视图时遇到了这个问题,并且 ssms 设计器自动添加了 fn{ exp ....} 但我改为使用脚本 Cerate View ViewName 我的 concat 脚本

这没有问题

于 2019-01-21T17:58:08.317 回答