与此MySQL查询等效的Microsoft SQL Server

与此MySQL查询等效的Microsoft SQL Server,mysql,sql,sql-server,Mysql,Sql,Sql Server,因此,我有以下MySQL存储过程,我的任务是在Microsoft SQL中创建相同的过程: SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(Record1 = ''',Record1,''', IsCompatible, NULL)) AS ''', CONCAT(pr.ProductName,' ', pr.ProductRelease), '''') ) INTO @sql F

因此,我有以下MySQL存储过程,我的任务是在Microsoft SQL中创建相同的过程:

SET @sql = NULL;
SELECT  
  GROUP_CONCAT(DISTINCT
    CONCAT('MAX(IF(Record1 = ''',Record1,''', IsCompatible, NULL)) AS ''',
           CONCAT(pr.ProductName,' ', pr.ProductRelease), '''')
  ) INTO @sql
FROM
  ProductCompatibility pc
  LEFT JOIN Products as pr
       on pr.id = pc.Record1;

SET @sql = CONCAT(
              'SELECT pr.id, CONCAT(pr.ProductName,'' '', pr.ProductRelease) as Product, ', @sql, '
                 FROM ProductCompatibility pc 
                 LEFT JOIN Products as pr
                    on pr.id = pc.Record2 
                 GROUP BY pc.Record2');

PREPARE stmt FROM @sql;
EXECUTE stmt;
下面的解析似乎是正确的,但当它被执行时,IF条件会出现错误。Microsoft SQL的正确语法是什么

DECLARE @sql varchar(MAX), @finalsql varchar(MAX)

SET @sql = (SELECT  dbo.GROUP_CONCAT(DISTINCT
CONCAT('MAX(IF(pc.Record1 = ''',pc.Record1,''', pc.IsCompatible,
NULL)) AS ''',
           CONCAT(pr.ProductName,' ', pr.ProductRelease), '''')) FROM   [dbo].[ProductCompatibility] pc LEFT JOIN [dbo].[Products] as pr on
pr.id = pc.Record1);

SET @finalsql = CONCAT(
              'SELECT CONCAT(pr.ProductName,'' '', pr.ProductRelease) as Product, ', @sql, ' 
                    FROM compatibility_backup pc 
                 LEFT JOIN products_backup as pr
                    on pr.id = pc.Record2
                 GROUP BY pc.Record2');

EXECUTE(@finalsql);

任何指针?

< P>关于IF错误,考虑将它们更改为如果使用SQL Server 2012或更高版本或更低版本。

< P>在稍微深入挖掘之后,这是等效SQL Server函数的正确格式:

DECLARE @sql varchar(MAX), @finalsql varchar(MAX)

SET @sql = (SELECT
    dbo.GROUP_CONCAT(DISTINCT CONCAT('MAX(IIF(pc.Record1 = ''',pc.Record1,''', pc.IsCompatible, NULL)) AS ''',
           CONCAT(pr.ProductName,' ', pr.ProductRelease), ''''))
FROM 
    [dbo].[ProductCompatibility] pc LEFT JOIN [dbo].[Products] 
        as pr on pr.id = pc.Record1);

SET @finalsql = CONCAT(
              'SELECT CONCAT(pr.ProductName,'' '', pr.ProductRelease) as Product, ', @sql, ' 
                    FROM ProductCompatibility pc 
                 LEFT JOIN Products as pr
                    on pr.id = pc.Record2
                 GROUP BY pr.ProductName, pr.ProductRelease, pc.Record2');

EXECUTE(@finalsql);

事实证明,我必须在GROUPBY节中添加几个其他列来正确显示SQL条目。并且在使用IIF而不是IF时也使用@Revenant solution。

请发布您的错误堆栈您是否定义了
group\u concat()
函数?它不是SQL Server的一部分。SQL Server未附带本机“group concat”聚合运算符或等效运算符。必须将其添加为CLR-UDF(由Microsoft提供的实现)、UDF/TVF、R-CTE或实现(填充)xml等。或者,在客户端上执行非规范化。有关一些不同的解决方案,请参阅etc。我很清楚该组不属于SQL Server的一部分。我已经考虑过定义这些函数。我将研究使用iif,并评论这是否适用于我。因此,你用iif替换IF的建议让我更进一步,但现在出现以下错误:“Products.ProductName”列在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。列“Products.ProductRelease”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。