【问题标题】:SQLException at Inner Join内部连接处的 SQLException
【发布时间】:2013-08-15 12:05:18
【问题描述】:

我正在使用一个 C# 程序,该程序调用在 SQL Server 2008 R2 实例上执行的 SQL 语句。这是 SQL 调用:

SELECT TOP 1 as1.AssetTagID, as1.TagID, as1.CategoryID, as1.Description,
    as1.HomeLocationID, as1.ParentAssetTagID 
    FROM Assets AS as1 ORDER BY ar.DateScanned DESC
INNER JOIN AssetsReads AS ar
ON as1.AssetTagID = ar.AssetTagID
WHERE (ar.ReadPointLocationID='Readpoint1' OR ar.ReadPointLocationID='Readpoint2')
    AND as1.TagID!='000000000000000000000000';

我在 INNER 周围收到了一个 SQLException。异常文本如下:

System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'INNER'.

我也可以将堆栈跟踪放在这里,但我觉得这会使问题变得混乱。这是我在调用中使用的 C# 代码中的实际字符串:

"SELECT TOP 2 as1.AssetTagID, as1.TagID, " +
    "as1.CategoryID, as1.Description, as1.HomeLocationID," +
    "as1.ParentAssetTagID FROM Assets AS as1 ORDER BY ar.DateScanned DESC\n" +
    "INNER JOIN AssetsReads AS ar ON as1.AssetTagID = ar.AssetTagID\n" +
    "WHERE (ar.ReadPointLocationID='" + IntegrationService.Lane2Zones[0] + 
    "' OR ar.ReadPointLocationID='" + IntegrationService.Lane2Zones[1] + "')\n" +
    "AND as1.TagID!='000000000000000000000000';"

【问题讨论】:

  • 为什么\n?只需使用空格而不是 \n。
  • 为什么要在字符串中加入'\n'?
  • 我一直认为 SQL 语句出于某种原因总是需要换行符。我猜这是错的?抱歉,我不太习惯使用 SQL。
  • 这里有一个很好的链接,它将显示并解释连接中的差异以及 ORDER BY 子句的位置mssqltips.com/sqlservertip/1667/sql-server-join-example

标签: c# sql sql-server-2008-r2 inner-join


【解决方案1】:

您的 ORDER BY 语句不能在那里。移到最后

我还将发表强制性的“不要这样做”演讲。像这样连接 SQL 字符串会使您面临 SQL 注入攻击。 SO 和 Google 上有很多关于这方面的信息,所以我不会深入探讨,但您绝对应该考虑将其设为参数化查询。

【讨论】:

  • 感谢您提供有关注射的提示。但是这个应用程序被部署在一个私有网络上,所以(希望)我们不必担心这个。
【解决方案2】:

就像他说的......你的 order by 子句有问题:)

SELECT TOP 1 as1.AssetTagID,
         as1.TagID,
         as1.CategoryID,
         as1.Description,
         as1.HomeLocationID,
         as1.ParentAssetTagID
FROM   Assets AS as1
   INNER JOIN AssetsReads AS ar
           ON as1.AssetTagID = ar.AssetTagID
WHERE  ( ar.ReadPointLocationID = 'Readpoint1'
      OR ar.ReadPointLocationID = 'Readpoint2' )
   AND as1.TagID != '000000000000000000000000'
ORDER  BY ar.DateScanned DESC; 

我还要注意,Microsoft (http://technet.microsoft.com/en-us/library/ms190387(v=sql.105).aspx) 建议使用模式限定对象。此外,您应该在顶部(价值)声明周围使用括号。

SELECT TOP (1) [as1].[AssetTagID],
           [as1].[TagID],
           [as1].[CategoryID],
           [as1].[Description],
           [as1].[HomeLocationID],
           [as1].[ParentAssetTagID]
FROM   [<schema>].[Assets] AS [as1]
   INNER JOIN [<schema>].[AssetsReads] AS [ar]
           ON [as1].AssetTagID = [ar].[AssetTagID]
WHERE  ( [ar].[ReadPointLocationID] = 'Readpoint1'
      OR [ar].[ReadPointLocationID] = 'Readpoint2' )
   AND cast([as1].TagID AS [INT]) != 0
ORDER  BY [ar].[DateScanned] DESC; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-21
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多