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
==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