1

SELECT @VAR = @VAR + FIELD FROM TABLE ORDER BY OTHERFIELD我在 Sql Server 2008 中有代码,它使用经过验证的语法将查询中的一些字符串连接到变量中。

这是我的确切 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 突然用于过滤我的结果?

我不能使用 XML/STUFF 路由,因为某些数据中确实有 < 和 > 符号。
我宁愿不必重新使用旧的 WHILE 循环,但我可能不得不这样做。

4

1 回答 1

3

如评论中所示,您依赖于无证行为。

微软说“聚合连接查询的正确行为是未定义的。 ”。如果计算标量移动到计划中的错误位置,那么它就会停止工作。

您正在使用的工作是在子查询中定义排序表达式并连接此查询的结果,认为是安全的。从SQL Server 中的排序保证...

出于向后兼容性的原因,SQL Server 在最顶层范围内支持 SELECT @p = @p + 1 ... ORDER BY 类型的赋值。

该帖子是在 2005 年写的,所以我不确定保证是否仍然有效(编辑:在查看有关此问题的 Connect Items后,我确定它没有)

顺便说一句:你说

我不能使用 XML/STUFF 路由,因为某些数据中确实有 < 和 > 符号。我宁愿不必重新使用旧的 WHILE 循环,但我可能不得不这样做。

情况并非如此,但它需要一个XML PATH比您可能使用的查询更复杂的查询,请参阅此处的答案以获取示例

于 2012-10-15T20:58:32.287 回答