Concat在SQL Server中不起作用

时间:2014-11-13 06:56:20

标签: sql-server

我有一个名为product的表,其中包含name(nvarchar 1000),

P1
P2
P3
P4

我有一个名为accnt_test的帐户表,其中包含product_name。

id   name
A1   P1;;p2;;p3;;p4
A2   P1;;p2
A3   P1;;p2;;p3
A4   P1;;p2;;p3;;p4
A5   P1

我必须从帐户表中选择那些包含产品表中所有产品的帐户。

所以我的输出应该是这样的:

id  name
A1  P1;;p2;;p3;;p4
A4  P1;;p2;;p3;;p4

因为这两个帐户包含产品表中的所有产品。

我在SQL Server中编写了一个查询,但它无法正常工作。

这是查询:

SELECT *
  FROM accnt_test ACC
 WHERE ACC.product_name IN
       (SELECT VM.product_name
          FROM (SELECT A.*, P.NAME
                  FROM accnt_test A, product P
                 WHERE A.product_name LIKE
                       CONCAT('%', CONCAT(P.NAME, '%'))) VM
         GROUP BY VM.product_name
        HAVING COUNT(*) = (SELECT COUNT(DISTINCT NAME) FROM PRODUCT));

那么如何在concat的情况下使用它。

但是SQL Server显示错误:

sg 195, Level 15, State 10, Line 9
'CONCAT' is not a recognized built-in function name.
 Msg 102, Level 15, State 1, Line 11
Incorrect syntax near ')'.

2 个答案:

答案 0 :(得分:1)

CONCAT是SQL Server 2012的新功能。它不是早期版本的功能,包括2008 R2。

使用'fn concat'

select {fn concat('%', {fn concat('String', '%')})}

这是带有'fn concat'的代码。它会起作用。

SELECT *
  FROM accnt_test ACC
 WHERE ACC.product_name IN
       (SELECT VM.product_name
          FROM (SELECT A.*, P.NAME
                  FROM accnt_test A, product P
                 WHERE A.product_name LIKE
                       {fn concat('%', {fn concat(P.NAME, '%')})}) VM
         GROUP BY VM.product_name
        HAVING COUNT(*) = (SELECT COUNT(DISTINCT NAME) FROM PRODUCT));

答案 1 :(得分:1)

您的代码中包含太多错误。根据MySQL,SQL SERVER 2008R2或以前版本中没有内置concat函数。尝试更改您的查询:

SELECT *
FROM   accnt_test ACC
WHERE  ACC.product_name IN (SELECT A.product_name
                            FROM   accnt_test A,
                                   product P
                            WHERE  A.product_name LIKE '%' + P.NAME + '%')
GROUP  BY product_name
HAVING Count(*) = (SELECT Count(DISTINCT NAME)
                   FROM   PRODUCT)