【问题标题】:converting to uniqueidentifier in SQL在 SQL 中转换为 uniqueidentifier
【发布时间】:2014-02-18 19:09:33
【问题描述】:

我需要以下内容作为唯一标识符,以便它可以正确加入更大的查询。有没有更好的方法来做到这一点?

这里是 SQL

 -- Report Totals
-- Set date range and this query will look at each specific Crystal Report and how long each one takes to run.  
DECLARE @StartDate DATETIME,
      @EndDate DATETIME;


SELECT @StartDate = '10/01/2013', @EndDate = '1/1/2014';

SELECT COUNT(*) AS RunCount, AVG(DATEDIFF(s, SJ.queuedtime, SJ.completetime)) AS TotalTime,
       AVG(DATEDIFF(s, SJ.queuedtime, SJ.starttime)) AS WaitTime,
       AVG(DATEDIFF(s, SJ.starttime, SJ.completetime)) AS RunTime, 
         RP.label AS Report, RP.reportTitle

FROM SJob SJ

JOIN RReport R ON CAST(SUBSTRING(SJ.props, CHARINDEX('reportID=', SJ.props, 0) + 9, 36) AS UNIQUEIDENTIFIER) = R.reportID
JOIN RPhysicalReport RP ON R.physicalReportID = RP.physicalReportID

WHERE SJ.queuedtime >= @StartDate and SJ.queuedtime < @EndDate and SJ.jobClass = 'CRWPrint'

GROUP BY RP.label, RP.reportTitle

ORDER BY RunTime DESC 

当我运行它时,我得到了

消息 8169,第 16 级,状态 2,第 9 行 从字符串转换为唯一标识符时转换失败。

【问题讨论】:

  • 向我们展示 SJ.props 值
  • 这是一个超过 2000 个字符的文本字段。其中一些是客户数据,所以我不能真正发布它。它实际上是一串连续的数据。我可以只撤回我需要的部分并且它可以工作,但是当我尝试将其转换或转换为 UI 时,它会在转换时失败。
  • @BSanders 然后显示为RIGHT(SUBSTRING(SJ.props, CHARINDEX('reportID=', SJ.props, 0), 45), 36) 的结果。我们需要知道它是否具有UNIQUEIDENTIFIER 的格式。 - 的位置是否正确?只有从 AE 的数字和字母?
  • 这是返回 E2715BAC-5E84-42EB-A15A-428F022BBF6E
  • @BSanders 确实转换为UNIQUEIDENTIFIER 没有任何问题

标签: sql sql-server


【解决方案1】:

可能存在以下两个问题之一:

  1. 您没有得到全部 36 个字符,因为 reportID 后面有尾随字符。
  2. GUID 格式不正确,可能是因为缺少破折号或破折号位置不正确。

假设 reportID= 之后的值是有效的 GUID,以下代码可以解决第一个问题:

DECLARE @SomeString VARCHAR(MAX) = 'sometextwithar=somethingelse&reportID=5289A1C3-07E3-4CE3-B2C4-78E6B631458E&something';

SELECT CONVERT(UNIQUEIDENTIFIER, SUBSTRING(@SomeString, CHARINDEX('reportID=', @SomeString, 0) + 9, 36)) AS reportID;

我建议删除 CAST to UNIQUEIDENTIFIER 部分并检查您尝试转换的字符串。

【讨论】:

  • 感谢您的回复。我尝试了你所说的,我可以自行转换该字段,但它仍然失败,因为上面显示的整个查询。
【解决方案2】:

这是通过在我的 JOIN 子句中使用 CONVERT(VARCHAR(36), R.reportID) 解决的。它现在可以正常工作了。

【讨论】:

    猜你喜欢
    • 2010-11-26
    • 2015-01-03
    • 2010-10-15
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    相关资源
    最近更新 更多