FOR XML 命令在 SQL Server 2008 R2 中有效,但在 SQL Server 2017 中无效

FOR XML command works in SQL Server 2008 R2 but not in SQL Server 2017

==Edited to include outputs from each server==
==Edited to include additional table definition information==

我正在尝试将 运行ning 在 SQL 2008R2 数据库上的应用程序与 运行s 在 SQL Server 2017 数据库上的新应用程序集成。

这是由 SQL 脚本执行的,这些脚本 运行 作为 2017 数据库的存储过程,用于从 2008 数据库复制信息。

下面的 SQL 脚本在 2008R2 数据库(在 management studio 2014 中)上运行良好,并使用 for XML 命令生成对应于一周的 1 和 0 的字符串列表activity 发生。 1= 发生,0 = 不发生,此脚本是更大的 SQL 脚本的一部分。

当我 运行 在 2017 服务器上的 SQL Management Studio 17 中 运行 此脚本将 2008R2 数据库设置为链接服务器时,脚本 运行s 但 FOR XML 仅导出 return 一个 0 字符串并且没有按预期工作。

我查看了 For XML 命令,但我不知道它在 SQL 服务器上的不同版本上有任何不同。

我还有另外 10-15 个集成脚本(尽管其他 none 使用 for xml 命令),它们在 2008 年和 2017 年数据库之间运行良好,其中 2008 年数据库是链接服务器。

我可以通过链接服务器单独 return 来自 table 的信息,但是当我尝试 运行 查询 activity id returns 成功但代码字符串没有。

我不得不使用 for XML 脚本,因为旧数据库将 activity 的每次出现记录为单独的行,而新系统记录 [=70= 的一条记录],然后记录一个由 0 和 1 组成的字符串,作为周模式来表示是否出现 activity。

我不知道是 for xml 命令本身的使用,还是它是通过链接服务器 运行 的事实。

在下面的脚本中,出于安全原因,我删除了对链接服务器和数据库名称的引用,但如前所述,该脚本在我的 2008R2 环境中运行良好。

2008 年 运行 时,我收到以下输出

+------------+-------------------------------------------------+
| activityid |                      code                       |
+------------+-------------------------------------------------+
|      59936 | 11111110111111100000000000000000000000000000000 |
+------------+-------------------------------------------------+

2017 年 运行 时,我收到以下输出

+------------+-------------------------------------------------+
| activityid |                      code                       |
+------------+-------------------------------------------------+
|      59936 | 00000000000000000000000000000000000000000000000 |
+------------+-------------------------------------------------+

vw_AcademicWeeks 元素是一个获取以下信息的视图

 +----------------+-------------+
|     Field      |    Type     |
+----------------+-------------+
| ay_code        | varchar(4)  |
| week_number    | int         |
| ay_start       | date        |
| ay_end         | date        |
+----------------+-------------+

这 returns 为一学年内的每个星期的开始和结束日期(示例如下所示)

+---------+---------+------------+------------+
| ay_code | week_no |  ay_start  |   ay_end   |
+---------+---------+------------+------------+
|    1718 |       1 | 01/08/2017 | 06/08/2017 |
|    1718 |       2 | 07/08/2017 | 13/08/2017 |
|    1718 |       3 | 14/08/2017 | 20/08/2017 |
|    1718 |       4 | 21/08/2017 | 27/08/2017 |
+---------+---------+------------+------------+

TT_Activitytable设置如下

+----------------------+-----------+
|      Colum Name      | Data Type |
+----------------------+-----------+
| ActivityOccurrenceID | int       |
| ActivityID           | int       |
| StartTime            | datetime  |
| EndTime              | datetime  |
+----------------------+-----------+

此 table 包含多行 activity,具有不同的开始和结束时间,即如果每天上午 9 点发生 activity,则一周将有五个条目

+----------------------+------------+---------------------+---------------------+
| ActivityOccurrenceID | ActivityID |      StartTime      |       EndTime       |
+----------------------+------------+---------------------+---------------------+
|              2214753 |      65577 | 12/07/2019 13:30:00 | 12/07/2019 14:30:00 |
|              2214752 |      65577 | 05/07/2019 13:30:00 | 05/07/2019 14:30:00 |
|              2214906 |      65583 | 02/07/2019 14:30:00 | 02/07/2019 16:00:00 |
|              2215967 |      65613 | 02/07/2019 14:30:00 | 02/07/2019 16:00:00 |
|              2226569 |      65949 | 02/07/2019 14:30:00 | 02/07/2019 16:00:00 |
|              2226754 |      65963 | 02/07/2019 14:30:00 | 02/07/2019 16:00:00 |
+----------------------+------------+---------------------+---------------------+

TT_Activity 字段包含 activity 的基本信息,每个 activity

包含一条记录
+-------------+--------------+
| Colum Name  |  Data Type   |
+-------------+--------------+
| ActivityID  | int          |
| Code        | varchar(40)  |
| Description | varchar(255) |
| PeriodID    | int          |
+-------------+--------------+

其中包含以下信息

+------------+---------+-------------+----------+
| ActivityID |  Code   | Description | PeriodID |
+------------+---------+-------------+----------+
|      20668 | Maths   | Maths       |     2017 |
|      20669 | English | English     |     2017 |
|      20670 | Science | Science     |     2017 |
+------------+---------+-------------+----------+

==SQL下面查询==

select 
tta2.activityid,
  (
    select 
        case when ttao.endtime is null then '0' else '1' end
    from    
        vw_AcademicWeeks aw
        left join 
        TT_ActivityOccurrence ttao 
        on
        (dateadd(dd,datediff(dd,0,DATEADD(dd, -(DATEPART(dw, ttao.StartTime)-1), ttao.StartTime)),0)) = aw.ay_start
        and ay_code='1718' 
        and ttao.ActivityID=tta2.ActivityID
    where 
        aw.week_no>=6 
    group by 
        ttao.ActivityID,
        aw.week_no,
        case when ttao.endtime is null then '0' else '1' end
    having 
        count(aw.week_no)<>9
    order by 
        week_no asc
    FOR XML PATH(''))as code



  from
    TT_Activity tta2

    where tta2.PeriodID='2017'    

再次查看代码并将其拆开后,我找到了问题的原因。

2008 R2服务器语言设置为英式,2017服务器语言设置为美式英语 .

这导致 vw_AcademicWeeks 视图创建错误的一周开始日期和结束日期,因此下面的公式字符串返回的日期不正确,因此不匹配。

TT_ActivityOccurrence TTAO ON (dateadd(dd, datediff(dd, 0, DATEADD(dd, - (DATEPART(dw, ttao.StartTime) - 1), ttao.StartTime)), 0)) = aw.ay_start