2011-11-17 52 views
0

我现在有这个存储过程。我想限制字符串ChanceOfSuccess仅为“40%”等百分比。现在这个字符串读起来像这样“40% - 思考它”。什么是最好的方法来做到这一点?在SQL存储过程中提取字符串的某些部分

CREATE PROCEDURE [dbo].[procActivity_SelectbyOutstandingActivitiesNew] 
AS 
SELECT C.[Name] AS [Customer], 
     C.CustomerId AS [CustomerID], 
     E.FirstName + ' ' + E.Surname AS [Employee], 
     AT.[TypeName] AS [Activity Type], 
     A.[ActivityDate] AS ActivityDate, 
     A.NextActivityDate, 
     A.[ChanceOfSuccess] AS ChanceOfSuccess, 
     A.[Comments] AS Comments, 
     U.Surname + ' ' + U.FirstName AS [User], 
     E.EmployeeId, 
     A.ActivityId, 
     CONVERT(INT, SUBSTRING(A.ChanceOfSuccess, 0, CHARINDEX ('%',A.ChanceOfSuccess))) AS [Success Percentage], 
     A.[IsComplete] 

FROM Customer C 
INNER JOIN Activity A ON A.CustomerId = C.CustomerId 
INNER JOIN Employee E ON E.EmployeeId = A.EmployeeId AND E.CustomerId = C.CustomerId 
INNER JOIN [ActivityType] AT ON A.[ActivityTypeId] = AT.[ActivityTypeId] 
INNER JOIN [User] U ON A.[UserId] = U.[UserId] 
LEFT OUTER JOIN Activity A2 ON A.CustomerId = A2.CustomerId AND A.UserId = A2.UserId AND A2.ActivityDate > A.ActivityDate 
WHERE C.[IsDeleted] = 0 
AND  A.NextActivityDate <= GETDATE() 
AND  E.IsDeleted = 0 
AND  A.IsDeleted = 0 
AND (A2.ActivityId IS NULL OR A2.IsDeleted > 0) 
AND CONVERT(INT, SUBSTRING(A.ChanceOfSuccess, 0, CHARINDEX ('%',A.ChanceOfSuccess))) < 100 
ORDER BY A.NextActivityDate ASC, Customer, A.ActivityDate ASC, [Success Percentage] DESC 
GO 
+1

你真的应该被存储成功的在一个单独的整数字段的机会。此外,这个问题不是任何有关存储过程的东西,它更多的是关于字符串操作和子串连 – Seph

回答

1

家庭作业?你显然没有写出原始查询,因为它已经在做这项工作。

行:

CONVERT(INT, SUBSTRING(A.ChanceOfSuccess, 0, CHARINDEX ('%',A.ChanceOfSuccess))) AS [Success Percentage], 

已经这样做了,你想要什么,然后将其转换为int,所以取下转换,你应该有你想要的东西。

DECLARE @v VARCHAR(50) = '40% - Thinking about it' 

SELECT @V, SUBSTRING(@V, 0, charindex('%', @V)+1) 
+0

没有不作业。实习工作和我正在从事某人以前的工作。用sql我不是那么棒。 – user1051364

0

这里有一些surgestions如何重写代码:

create view [v_OutstandingActivities] 
AS 
SELECT C.[Name] AS [Customer], 
     C.CustomerId AS [CustomerID], 
     E.FirstName + ' ' + E.Surname AS [Employee], 
     AT.[TypeName] AS [ActivityType], 
     A.[ActivityDate] AS ActivityDate, 
     A.NextActivityDate, 
     A.[ChanceOfSuccess] AS ChanceOfSuccess, 
     A.[Comments] AS Comments, 
     U.Surname + ' ' + U.FirstName AS [UserName], 
     E.EmployeeId, 
     A.ActivityId, 
     replace(A.ChanceOfSuccess, '%', '')+0 AS [SuccessPercentage], 
     A.[IsComplete] 

FROM Customer C 
INNER JOIN Activity A ON A.CustomerId = C.CustomerId 
INNER JOIN Employee E ON E.EmployeeId = A.EmployeeId AND E.CustomerId = C.CustomerId 
INNER JOIN [ActivityType] AT ON A.[ActivityTypeId] = AT.[ActivityTypeId] 
INNER JOIN [User] U ON A.[UserId] = U.[UserId] 
LEFT OUTER JOIN Activity A2 ON A.CustomerId = A2.CustomerId AND A.UserId = A2.UserId 
AND A2.ActivityDate > A.ActivityDate AND (A2.IsDeleted > 0) 
WHERE C.[IsDeleted] = 0 
AND  A.NextActivityDate <= GETDATE() 
AND  E.IsDeleted = 0 
AND  A.IsDeleted = 0 
AND replace(A.ChanceOfSuccess, '%', '') < 100