我有一张推荐表。有些标记为内部,有些标记为外部。我想要做的是生成一个记录集,输出所有内部记录,然后输出 5 个外部记录,这些记录集是随机排序的。我直接在我的数据库中成功构建了 SQL,它返回的正是我想要的。它看起来像这样:
(SELECT tText, tName FROM tblTestimonials WHERE tExternal = 0 ORDER BY RAND())
UNION
(SELECT tText, tName FROM tblTestimonials WHERE tExternal = 1 ORDER BY RAND() LIMIT 5)
然而,当我将它插入到我的经典 ASP 页面时,该页面使用性质非常相似的简单非 UNION SQL 语句完全正常工作,当我尝试输出 tText 时它失败了。 tName 没问题(如果我将它添加到 SELECT 语句中,它也很乐意输出 tExternal)。
我收到这个错误:
error '80020009'
Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.
tName
(有效)是一个可为空的 varchar(500)
tText
(哪些错误)是可为空的 varchar(8000)
看起来 UNION 正在对较大文本字段的数据类型做一些事情。我能够让它工作的唯一方法是使用:
(SELECT CONVERT(tText, CHAR(500)) AS tText, tName FROM tblTestimonials WHERE tExternal = 0 ORDER BY RAND())
UNION
(SELECT CONVERT(tText, CHAR(500)) AS tText, tName FROM tblTestimonials WHERE tExternal = 1 ORDER BY RAND() LIMIT 5)
但后来我丢失了很多数据。我只能输出不完整的评论。
如果有人对此有任何经验,我将不胜感激。
最佳答案
我以前遇到过这个问题。
如果您使用 UNION ALL
而不是 UNION
,您会发现它神奇地工作。
它们之间的区别是 UNION
对行进行重复数据删除(使用动态临时表),UNION ALL
不会。由于不需要重复数据删除,因此使用 Union All 应该没问题。
为什么有效?我只能推测。
在重复数据删除过程中(或之后),数据可能会损坏并成为无法在客户端处理的内容(ODBC 的 OLEDB 提供程序 (MSDASQL) 位于 ASP 和 MySQL ODBC 驱动程序之间)。
关于mysql - 带有 MySQL UNION 的经典 ASP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42903058/