指定SELECT *时的传输级错误

时间:2010-10-04 13:08:08

标签: sql sql-server tsql

以下查询不起作用,并产生错误:

  

从服务器接收结果时发生传输级别错误

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个项目),但是我真的需要在结果集中指定我需要的每一列吗?

4 个答案:

答案 0 :(得分:5)

尽管在编写客户端SELECT查询时避免使用*限定符通常是一种很好的做法,但可能有一些原因导致它无法正常工作:

  • 您正在使用的SQL Server产品,或者您使用的驱动程序不支持在单个查询中检索那么多(100)列。
  • 您尝试获取的所有列的总大小大于支持的最大值(最有可能是驱动程序) - 如果您的某些列属于大型数据类型且包含大量数据,则可能会发生这种情况例如许多VARCHAR(MAX)或TEXT列
  • 或者您的服务器和客户端之间实际上可能存在网络连接不良 - 您应该通过在服务器上本地执行查询来验证这一点。

修改

  

好的,所以问题似乎是其中一列包含大约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'