2014-02-18 34 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)來解決的。它現在可以正常工作。

相關問題