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

この場合、2 つのパラメーターを受け入れ、1 つの値を返すスカラー 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 に答える
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値を渡した値をキャストできない場合INT、クエリに例外が発生することを追加したいだけです。

于 2013-03-29T08:10:42.553 に答える
1

CREATE FUNCTIONで終了する必要がありGOます。また、SELECTサブクエリの最後には閉じ括弧が必要です。

(あなたの質問は構文エラーに関するものでした)。

于 2013-03-29T08:14:52.313 に答える