Sql server FOR XML命令适用于SQL Server 2008 R2,但不适用于SQL Server 2017
我正在尝试将运行在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年运行时,我收到以下输出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
==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年的产出