字符串查询中的列在执行时没有被分隔

Posted

技术标签:

【中文标题】字符串查询中的列在执行时没有被分隔【英文标题】:Columns in string query not being delimited when executed 【发布时间】:2020-01-07 17:53:19 【问题描述】:

我有一个设置为字符串的 SQL 语句。每当我在本地应用程序中执行调用时,我都会收到一个错误,似乎 SQL 没有正确构建,并且两个不同列之间没有用逗号分隔。我想知道为什么会这样。在这些列之间有一个带有表达式的 Iif 语句,但我不确定在语法上如何使字段分隔。

我得到的错误是:

捕获到异常:System.Data.dll 中的“System.Data.SqlClient.SqlException”(“无效的列名 'CONTACT_EMAILT'。”)

以下是现有的查询字符串:

strSQLXL = "SELECT V.VND_NBR
  ,VND_NAME
  ,C.CONTACT_NAME
  ,C.CONTACT_EMAIL," & IIf(MyApp.objUserShadow.CountryUserSelected = 1, "T.[NAME] AS CONTACT_TYPE ", " ") & "  
FROM dbo.TBL_VND_VBU AS V
INNER JOIN dbo.TBL_VND_VBU_CONTACT AS C
ON V.VND_NBR = C.VND_NBR AND V.CRY_CD = C.CRY_CD
INNER JOIN dbo.TBL_VND_TYPE AS T
ON C.CONTACT_TYPE = T.ID 
WHERE V.CRY_CD = " & VMS.objUserShadow.CountryUserSelected

根据 Intellitrace 日志执行此操作时的输出如下:

SELECT V.VND_NBR
      ,VND_NAME
      ,C.CONTACT_NAME
      ,C.CONTACT_EMAILT.[NAME] AS CONTACT_TYPE
FROM dbo.TBL_VND_VBU AS V
INNER JOIN dbo.TBL_VND_VBU_CONTACT AS C
ON V.VND_NBR = C.VND_NBR AND V.CRY_CD = C.CRY_CD
INNER JOIN dbo.TBL_VND_TYPE AS T
ON C.CONTACT_TYPE = T.ID 
WHERE V.CRY_CD = 1

输出应该是:

SELECT V.VND_NBR
          ,VND_NAME
          ,C.CONTACT_NAME
          ,C.CONTACT_EMAIL
          ,T.[NAME] AS CONTACT_TYPE   
    FROM dbo.TBL_VND_VBU AS V
    INNER JOIN dbo.TBL_VND_VBU_CONTACT AS C
    ON V.VND_NBR = C.VND_NBR AND V.CRY_CD = C.CRY_CD
    INNER JOIN dbo.TBL_VND_TYPE AS T
    ON C.CONTACT_TYPE = T.ID 
    WHERE V.CRY_CD = 1

我是否缺少像上面的输出那样格式化它的东西?我已经修改了很多,但似乎无法让它以正确的格式正确构建。任何建议都非常感谢!

【问题讨论】:

@marc_s 我添加了 sql server 2008 标签。谢谢! 我猜你需要在 T.[NAME]:IIf(MyApp.objUserShadow.CountryUserSelected = 1, " T.[NAME] 之前添加空格,因为在字符串结果中它被连接到 CONTACT_EMAIL。 @jonathana 感谢您的努力,但我仍然遇到同样的错误 如果你在 strSQLXL 之后放置一个断点,你会得到什么?您还确定那是正在执行的代码吗?我已经对其进行了测试,并按预期工作......也许你的代码中有更多相关部分可以显示 示例代码无法生成文档输出。具体来说,IIf 之前的字符串中有一个逗号:C.CONTACT_EMAIL,"CONTACT_EMAIL 列名后面的逗号必须在输出中,但不是。因此,请更新代码和/或输出以使其准确。 【参考方案1】:

逗号在错误的位置:只有在要包含附加列时才应该在那里:

Dim contactTypeColumn As String = If(MyApp.objUserShadow.CountryUserSelected = 1, ", T.[NAME] AS CONTACT_TYPE ", " ")

strSQLXL = "SELECT V.VND_NBR
  ,VND_NAME
  ,C.CONTACT_NAME
  ,C.CONTACT_EMAIL" & contactTypeColumn & "  
FROM dbo.TBL_VND_VBU AS V
INNER JOIN dbo.TBL_VND_VBU_CONTACT AS C
ON V.VND_NBR = C.VND_NBR AND V.CRY_CD = C.CRY_CD
INNER JOIN dbo.TBL_VND_TYPE AS T
ON C.CONTACT_TYPE = T.ID 
WHERE V.CRY_CD = " & VMS.objUserShadow.CountryUserSelected

【讨论】:

【参考方案2】:

试试这个代码:

strSQLXL = "SELECT V.VND_NBR, VND_NAME, C.CONTACT_NAME, C.CONTACT_EMAIL" & _
           IIf(MyApp.objUserShadow.CountryUserSelected = 1, ", T.[NAME] AS CONTACT_TYPE ", " ") & _
           "FROM dbo.TBL_VND_VBU AS V INNER JOIN dbo.TBL_VND_VBU_CONTACT AS C " & _
           "ON V.VND_NBR = C.VND_NBR AND V.CRY_CD = C.CRY_CD " & _
           "INNER JOIN dbo.TBL_VND_TYPE AS T ON C.CONTACT_TYPE = T.ID " & _
           "WHERE V.CRY_CD = " & _
           VMS.objUserShadow.CountryUserSelected

【讨论】:

Iif() 是一个 VBA 函数。 我知道它是什么,IIf 在返回值之前评估其所有参数,而IF 是一个像短路条件一样执行的运算符,只评估 true 或错误的论点;差别很大。 你和 OP 不是把逗号放在了错误的地方吗? C.CONTACT_EMAIL 之后的逗号应该在 IIF 块中:“, T.[NAME] AS CONTACT_TYPE” 否则你在错误评估的 FROM 部分之前有一个逗号..

以上是关于字符串查询中的列在执行时没有被分隔的主要内容,如果未能解决你的问题,请参考以下文章

Excel 怎样去除单元格中的tab分隔符

为啥从 XML 导入 Access 数据库时数据会被截断

拆分由空白字符分隔的数字列。

在 Laravel 的列中使用连接和逗号分隔值执行查询

Oracle查询语句中重命名的列在WHERE中无效?

根据 Python 函数输出指定的列在 Google BigQuery 上进行查询