以下查询不起作用,并产生错误:
从服务器接收结果时发生传输级别错误
SELECT
*
FROM
table1 a,
table2 b,
table3 c
WHERE
a.location = b.location AND
b.location = c.location AND
a.id = c.id AND
a.entry = ''34690''
虽然此查询有效:
SELECT
a.location,
a.id,
a.entry,
c.desc,
b.name
FROM
table1 a,
table2 b,
table3 c
WHERE
a.location = b.location AND
b.location = c.location AND
a.id = c.id AND
a.entry = ''34690''
我需要从所有表中选择几乎所有内容(大约100个项目),但是我真的需要在结果集中指定我需要的每一列吗?
答案 0 :(得分:5)
尽管在编写客户端SELECT查询时避免使用*
限定符通常是一种很好的做法,但可能有一些原因导致它无法正常工作:
修改强>
好的,所以问题似乎是其中一列包含大约1000个字符的文本。绕过那一个?
您是否尝试过运行查询以仅返回导致问题的一列?如果您有自己的工作但导致完整查询失败,您可以尝试运行两个查询。一个用于获取其余列,另一个用于获取剩余的一列。然后在您的客户端中,重新组合信息..如果您确实使用此路线,则必须确保包含用于识别两个查询中的每个记录的任何唯一标识符,以便您可以映射回长文本 - 列到每条记录的其余信息。
答案 1 :(得分:3)
您收到的错误完全与网络连接有关,而不是正在执行的语句。
请使用完整错误消息更新问题。它将帮助追踪问题的根源。
您能确认服务器当时没有停机吗?使用SELECT *
语法时,错误是否可以100%预测?
答案 2 :(得分:2)
是的,您应该始终在生产代码中指定所需的列(在临时查询中运行一次就可以了)。不能这样做是一个SQL反模式。在您的情况下,您有连接,这意味着在最小值处重复连接字段,这会浪费服务器和数据库资源。指定字段并不难,您可以从对象浏览器中拖动所有列,因此没有理由不这样做。使用select *可以打破很多东西并使维护更糟糕。不要在生产代码中使用它。
顺便说一句,您不应该使用隐式连接。它们受到意外交叉连接的影响,它们更难维护(特别是当你需要稍后添加左连接时),如果你使用左连接或右连接的语法(它也被弃用)它们不能正常工作用更好的语法替换了18年的aog。
我希望SQL Server能够发送100个大于1000个字符的字段而不会出汗。不确定是什么导致传输错误,但是当连接被切断到数据库时通常会发生错误消息。
答案 3 :(得分:1)
尝试以下查询
选择一个。 * b。 * C。* FROM table1 a,table2 b,table3 c WHERE.location = b.location AND b.location = c.location AND a.id = c.id AND a.entry ='34690'