字符串查询中的列在执行时没有被分隔
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 部分之前有一个逗号..以上是关于字符串查询中的列在执行时没有被分隔的主要内容,如果未能解决你的问题,请参考以下文章