了解为什么我的CAST到INT无法正常工作

时间:2019-08-30 17:12:26

标签: sql-server tsql sql-server-2012

我有一个非常简单的代码正在尝试运行,但是由于我不明白的原因,它无法正常工作。这是我的代码:

WITH CTE AS
(
    SELECT DISTINCT OrderNo
    FROM OrderDet
    WHERE PartNo LIKE '%.%'
      AND OrderNo NOT LIKE '%[a-z]%'
)
SELECT * 
FROM CTE
WHERE CAST(CTE.OrderNo AS INT) >= 21187

运行此代码将引发以下错误:

  

将varchar值'20361E'转换为数据类型int时转换失败。

现在我知道有OrderNo个值包含'E',但是就我而言,我正在CTE中将它们过滤掉。如果我自己在CTE中运行该语句,则会得到580条记录,而这些记录中都没有字母。

这是怎么回事?

1 个答案:

答案 0 :(得分:7)

如评论中所述,您无法真正控制是否在过滤器之前尝试exports.myFunctionPending = functions.database.ref('/users/{uid}/profile/isPending') .onUpdate(async (change, context) => { const snapshot = change.after; const val = snapshot.val(); const userid = context.params.uid; //shows userid but is useless const authVar = context.auth; //says undefined and does nothing console.log(val); console.log(userid); const msg = { to: 'myemail@mydomain.com', from: 'noreply@mydomain.com', // custom templates templateId: 'd-b7aakjsdgwq7d798wq7d8', substitutionWrappers: ['{{', '}}'], //substitutions: { dynamic_template_data: { //name: user.displayName name: 'My Name' } }; try { await sgMail.send(msg); console.log('This was sucessful'); } catch(error) { console.error('There was an error while sending the email:', error); } return null; }); ;这完全取决于SQL Server选择如何优化查询。

此外,检查是否存在小数并且没有a-z并不是一种非常可靠的过滤非数字的方法。

我认为,以下两种方法都消除了CTE的需要,因为您只是在使用它来尝试强制首先执行过滤器。 CTE可以合并到其余查询中。 perhaps worth a read are some other tidbits about CTEs

尝试type MyJsonName struct { User []struct { Address []struct { City string `json:"city"` Country string `json:"country"` Street string `json:"street"` Zip string `json:"zip"` } `json:"address"` Authenticators []struct { Name string `json:"name"` Phone int `json:"phone"` } `json:"authenticators"` CdbID string `json:"cdb_id"` Email string `json:"email"` Firstname string `json:"firstname"` Lastname string `json:"lastname"` Phone int `json:"phone"` Status string `json:"status"` VoiceSig string `json:"voice_sig"` VoicesigCreatedTime string `json:"voicesig_created_time"` } `json:"user"` } (其中I wrote about here):

CAST

如果您使用的旧版本不支持TRY_CONVERT(),则可以尝试WHERE TRY_CONVERT(int, CTE.OrderNo) >= 21187; perhaps another useful read):

TRY_CONVERT

但是ISNUMERIC() is not all that reliable either

自从我们知道版本以来,您的查询可以简化为:

CASE