我在 Sql Server 2008 中有代码,它使用经过验证的方法将查询中的一些字符串连接到变量中SELECT @VAR = @VAR + FIELD FROM TABLE ORDER BY OTHERFIELD
syntax.
这是我的具体 SQL:
SELECT @SQL = @SQL +
ISNULL(FORMULA,
CASE WHEN USEMAP = 1 THEN
'dbo.getFieldTranslation('+CONVERT(VARCHAR,ROWID)+', [' + ISNULL(ENCOMPASSFIELD,'') + '])'
ELSE
'[' + ISNULL(ENCOMPASSFIELD,'') + ']' END
) +
' AS "' + FILECOLNAME + '",' + @CRLF
FROM dbo.EXPORTMAP_EX
WHERE WAREHOUSEID = @WHSID
ORDER BY ORDERIDX
这工作得非常完美。然后今天突然停止工作了。它只是连接最后一行的值。在调试中,我发现如果我取出ORDER BY
子句,然后所有字段都返回,但按字段的字符串值严格按字母顺序排序。
然而,此 SQL 用于生成导出视图。导出文件的字段必须按正确的顺序排列,因此需要 ORDER BY 子句。为什么 ORDER BY 突然服务于filter我的结果?
我无法使用 XML/STUFF 路由,因为某些数据中确实有 符号。
我不想再使用旧的 WHILE 循环,但我可能不得不这样做。
正如评论中所指出的,您依赖于无证行为。
微软说“聚合串联查询的正确行为未定义。 http://support.microsoft.com/kb/287515/en-us“。如果计算标量移动到计划中的错误位置,那么它就会停止工作。
您周围的工作是使用在子查询中定义排序表达式并连接此查询的结果 Ibelieve是安全的。从SQL Server 中的排序保证... http://blogs.msdn.com/b/sqltips/archive/2005/07/20/441053.aspx
出于向后兼容性的原因,SQL Server 提供了支持
最顶层的 SELECT @p = @p + 1 ... ORDER BY 类型的赋值
范围。
该帖子是 2005 年写的,所以我不确定保证是否仍然有效(编辑:之后查看有关此问题的 Connect Items https://stackoverflow.com/a/15163136/73226我确信不会)
顺便说一句:你说
我无法使用 XML/STUFF 路由,因为某些数据确实具有 符号。我宁愿不必回去使用旧的
WHILE 循环,但我可能必须这样做。
事实并非如此,但它需要稍微复杂一些XML PATH
查询比您可能使用的查询请参阅此处的答案作为示例 https://stackoverflow.com/a/1052353/73226.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)