1

我正在尝试计算表中使我创建的函数返回 1 的记录数。这是我所拥有的:

CREATE FUNCTION isErrorMismatch
(@theType nvarchar(1), @theExCode nvarchar(2))
RETURNS bit
AS
BEGIN
    DECLARE @theTypeAsInt int
    SET @theTypeAsInt = CAST(@theExCode AS INT)

    DECLARE @returnValue bit
    SET @returnValue = 0

    IF @theType = 'A'
        IF @theTypeAsInt >= 10 AND @theTypeAsInt <= 17 
            SET @returnValue = 0
        ELSE
            SET @returnValue = 1
    ELSE IF @theType = 'B'
        IF @theTypeAsInt >= 18 AND @theTypeAsInt <= 26 
            SET @returnValue = 0
        ELSE
            SET @returnValue = 1
    ELSE IF @theType = 'C'
        IF @theTypeAsInt >= 30 AND @theTypeAsInt <= 38 
            SET @returnValue = 0
        ELSE
            SET @returnValue = 1
    ELSE
            SET @returnValue = 1

    RETURN @returnValue
END

GO

SELECT (SELECT COUNT(*) 
FROM isErrorMismatch(LEFT(Type, 1),LEFT([Exception Code/Category],2)) 
As MismatchCount
FROM dbo.[All Service Ticket Data 2012_final]

我想计算使函数返回 1 的每条记录。当我调用该函数时,我的 FROM 中出现语法错误。有人有想法么?谢谢!

***更新:

为了获得使函数返回 1 的计数:

SELECT COUNT(dbo.isErrorMismatch(LEFT(Type, 1), LEFT([Exception Code/Category],2))) As MismatchCount
FROM dbo.[All Service Ticket Data 2012_final]
WHERE dbo.isErrorMismatch(LEFT(Type, 1), LEFT([Exception Code/Category],2)) = 1

为了获取使函数返回 1 的所有记录:

SELECT Type, [Exception Code/Category], 
dbo.isErrorMismatch(LEFT(Type, 1),LEFT([Exception Code/Category] ,2)) as Mismatch
FROM dbo.[All Service Ticket Data 2012_final]
WHERE dbo.isErrorMismatch(LEFT(Type, 1),LEFT([Exception Code/Category] ,2)) = 1
4

3 回答 3

2

您遇到错误,因为您的函数不是表格类型或不返回表格,因此您无法从中进行选择。但是,您可以通过这样做来实现它:

SELECT  COUNT(*)            
FROM    dbo.[All Service Ticket Data 2012_final] a
        INNER JOIN
            (
            SELECT  isErrorMismatch(LEFT(Type, 1),LEFT([Exception Code/Category],2)) IsMatched, Your_PK_Column_or_Id
            FROM    dbo.[All Service Ticket Data 2012_final]
            ) x ON x.Your_PK_Column_or_Id = a.Your_PK_Column_or_Id
WHERE   x.IsMatched = 1

我只想补充一点,如果您传递给该值的值@theExCode不能转换为 an ,INT那么您的查询中就会出现异常。

于 2013-03-29T08:10:42.553 回答
2

标量 UDF,在这种情况下接受两个参数并返回一个值。可以使用标量 UDF 的一些领域:

  • SELECT 或 GROUP BY 中的列表达式
  • FROM 子句中 JOIN 的搜索条件
  • WHERE 或 HAVING 子句的搜索条件

SELECT SUM(CAST(dbo.isErrorMismatch(LEFT(Type, 1), LEFT([Exception Code/Category],2)) AS int)) As MismatchCount
FROM dbo.[All Service Ticket Data 2012_final]
于 2013-03-29T08:32:56.923 回答
1

你需要结束CREATE FUNCTIONwith GO。此外,您的SELECT子查询最后需要一个右括号。

(您的问题是关于语法错误)。

于 2013-03-29T08:14:52.313 回答