2014-02-18 31 views
0

我需要以下才能成为唯一标识符,以便它能够在更大的查询中正确连接。有没有更好的方法来做到这一点?在SQL中转换为uniqueidentifier

这里是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号线从字符串转换为uniqueidentifier时 转换失败。

+2

向我们展示SJ.props值 – Dimitri

+0

这是一个超过2000个字符的文本字段。其中一些是客户端数据,所以我不能真正发布它。它实际上是一个连续的数据串。我可以撤回我需要的部分,它可以工作,但是当我尝试将其转换或转换为UI时,转换失败。 – BSanders

+0

@BSanders然后显示为RIGHT(SUBSTRING(SJ.props,CHARINDEX('reportID =',SJ.props,0),45),36)'的结果。我们需要知道它是否具有'UNIQUEIDENTIFIER'的格式。它是否在正确的位置有“-',只有数字和从'A'到'E'的字母? – Lamak

回答

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到UNIQUEIDENTIFIER部分并检查您正试图将字符串兑换。

+0

感谢您的回复。我尝试了你所说的,我可以单独获取该字段进行转换,但仍然会失败,因为上面显示的是整个查询。 – BSanders

0

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

相关问题