Sql server FOR XML命令适用于SQL Server 2008 R2,但不适用于SQL Server 2017

Sql server FOR XML命令适用于SQL Server 2008 R2,但不适用于SQL Server 2017,sql-server,sql-server-2008-r2,sql-server-2017,for-xml,Sql Server,Sql Server 2008 R2,Sql Server 2017,For Xml,我正在尝试将运行在SQL 2008R2数据库上的应用程序与运行在SQL Server 2017数据库上的新应用程序集成 这是由SQL脚本执行的,SQL脚本作为存储过程在2017数据库上运行,以跨2008数据库复制信息 下面的SQL脚本在management studio 2014的2008R2数据库上运行良好,并使用for XML命令生成一个1和0的字符串列表,对应于活动发生的一周。1=发生,0=不发生,此脚本是较大SQL脚本的一部分 当我在SQL management Studio 17中的2

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

这是由SQL脚本执行的,SQL脚本作为存储过程在2017数据库上运行,以跨2008数据库复制信息

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

当我在SQL management Studio 17中的2017服务器上以2008R2数据库设置作为链接服务器运行此脚本时,该脚本将运行,但FOR XML导出只返回0的sting,并且未按预期工作

我已经研究了For-XML命令,但没有发现它在SQL server上的不同版本上有任何不同的行为

我还有另外10-15个集成脚本,尽管其他脚本都没有使用for xml命令,但在2008和2017数据库之间工作得很好,其中2008数据库是一个链接服务器

我可以通过链接服务器从表中单独返回信息,但当我尝试运行查询时,活动id会成功返回,但代码字符串不会

我必须使用for XML脚本,因为旧数据库将活动的每次发生记录为一行,而新系统将为活动记录一条记录,然后记录一个0和1的字符串,该字符串作为一个星期模式来表示活动是否发生

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

在下面的脚本中,出于安全原因,我删除了链接服务器和数据库名称的引用,但正如前面提到的,该脚本在我的2008R2环境中工作得非常好

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

==Edited to include outputs from each server==
==Edited to include additional table definition information==
2017年运行时,我收到以下输出

+------------+-------------------------------------------------+
| activityid |                      code                       |
+------------+-------------------------------------------------+
|      59936 | 11111110111111100000000000000000000000000000000 |
+------------+-------------------------------------------------+
vw_元素是一个获取以下信息的视图

+------------+-------------------------------------------------+
| activityid |                      code                       |
+------------+-------------------------------------------------+
|      59936 | 00000000000000000000000000000000000000000000000 |
+------------+-------------------------------------------------+
+-------------+--------------+
| Colum Name  |  Data Type   |
+-------------+--------------+
| ActivityID  | int          |
| Code        | varchar(40)  |
| Description | varchar(255) |
| PeriodID    | int          |
+-------------+--------------+
这将返回一学年内每周的开始和结束日期,示例如下所示

 +----------------+-------------+
|     Field      |    Type     |
+----------------+-------------+
| ay_code        | varchar(4)  |
| week_number    | int         |
| ay_start       | date        |
| ay_end         | date        |
+----------------+-------------+
TT_活动表的设置如下所示

+---------+---------+------------+------------+
| 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 |
+---------+---------+------------+------------+
此表包含一项活动的多行,具有不同的开始和结束时间,即,如果一项活动每天上午9点发生,则一周将有五个条目

+----------------------+-----------+
|      Colum Name      | Data Type |
+----------------------+-----------+
| ActivityOccurrenceID | int       |
| ActivityID           | int       |
| StartTime            | datetime  |
| EndTime              | datetime  |
+----------------------+-----------+
TT_活动字段包含活动的基本信息,并包含每个活动的单个记录

+----------------------+------------+---------------------+---------------------+
| 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 |
+----------------------+------------+---------------------+---------------------+
其中包含以下信息

+------------+-------------------------------------------------+
| activityid |                      code                       |
+------------+-------------------------------------------------+
|      59936 | 00000000000000000000000000000000000000000000000 |
+------------+-------------------------------------------------+
+-------------+--------------+
| Colum Name  |  Data Type   |
+-------------+--------------+
| ActivityID  | int          |
| Code        | varchar(40)  |
| Description | varchar(255) |
| PeriodID    | int          |
+-------------+--------------+
==下面的SQL查询==

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

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

2008 R2服务器的语言设置为英国语,而2017服务器的语言设置为美国英语

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

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'    

我被你的问题弄糊涂了。您似乎在说您在SSMS 2008中运行了查询,这很好,但在SSMS 2017中没有。如果您连接到同一台服务器,则运行查询的SSM版本不会影响查询结果。SSMS不会影响数据引擎处理数据的方式。您好,欢迎使用SO。我们需要一些细节。这个查询似乎没有问题。这是一个好的开始。为清楚起见,我已将相关SSM的参考资料包括在内。您是正确的,查询在2008年有效,但在2017年无效。但是,正如我所说,如果您在连接到同一服务器时运行同一查询,则SSMS版本不会更改您的查询结果。如果不同版本上的结果不同,则您可能正在运行不同的查询,或者连接到不同的服务器。我正在将查询从我的2008实例复制到我的2017实例中,并且没有对其进行任何更改。服务器被设置为链接服务器,我的其他集成脚本工作正常,仅此一个。我将编辑这篇文章,展示2008年和2017年的产出