1

現在、次のクエリを実行していますが、上記のエラー メッセージが表示されます。

SELECT dbo.qryOtherFieldDataVerifySource.ItemID,
       dbo.qryOtherFieldDataVerifySource.EDGRDataID,
       dbo.qryOtherFieldDataVerifySource.LineItemID,
       dbo.qryOtherFieldDataVerifySource.ZEGCodeID,
       dbo.qryOtherFieldDataVerifySource.DataValue,
       dbo.tblBC.AcceptableValues,
       dbo.qryOtherFieldDataVerifySource.DataUnitID,
       dbo.qryOtherFieldDataVerifySource.DataDate,
       dbo.tblBC.DataTypeID,
       CASE
         WHEN DataTypeID = '{5951994B-BF47-4117-805D-B8F85FAB76A8}'
              AND ISNUMERIC(DataValue) = 1 THEN ( CASE
                                                    WHEN CAST(DataValue AS FLOAT(8)) >= 0 THEN 1
                                                    ELSE 0
                                                  END )
         ELSE 0
       END AS ValidPositiveNumericValue,
       CASE DataTypeID
        WHEN '{A6317BA5-F8FB-4866-A26B-24594650C2DC}'THEN ( CASE UPPER(DataValue)
        WHEN 'TRUE' THEN 1
        WHEN 'FALSE' THEN 1
        WHEN 'YES' THEN 1
        WHEN 'NO' THEN 1
        WHEN 'Y' THEN 1
        WHEN 'N' THEN 1
        WHEN '0' THEN 1
        WHEN '1' THEN 1
        ELSE 0
      END )
         WHEN '{5951994B-BF47-4117-805D-B8F85FAB76A8}' THEN ISNUMERIC(DataValue)
         ELSE 1
       END AS ValidDataType,
       dbo.tblZEGCode.ZEGCode,
       dbo.qryOtherFieldDataFieldName.FieldName
FROM   dbo.qryOtherFieldDataVerifySource
       LEFT OUTER JOIN dbo.qryOtherFieldDataFieldName
         ON dbo.qryOtherFieldDataVerifySource.ItemID = dbo.qryOtherFieldDataFieldName.ItemID
       LEFT OUTER JOIN dbo.tblBC
                       RIGHT OUTER JOIN dbo.tblZEGCode
                         ON dbo.tblBC.BCID = dbo.tblZEGCode.BCID
         ON dbo.qryOtherFieldDataVerifySource.ZEGCodeID = dbo.tblZEGCode.ZEGCodeID 

誰か提案はありますか?

4

3 に答える 3

6

e0テストする前に、値に連結するというトリックを使用して、フロート型 (別名リアル) に変換するのを妨げている悪い値を探すことをお勧めします。

SELECT *
FROM dbo.YourTable
WHERE
   DataTypeID = '{5951994B-BF47-4117-805D-B8F85FAB76A8}' -- the type for float
   AND IsNumeric(
      DataValue + CASE WHEN DataValue NOT LIKE '%[ed]%' THEN 'e0' ELSE '' END
   ) = 0
   AND IsNumeric(DataValue) = 1
;

これは、SQL Server 2000 以降で機能します。

更新 1 : 真に数値ではないすべてのものではなく、簡単に検出できないものだけを見つけたいと共有したので、2 番目を追加しましたIsNumeric

更新 2 : あなたの値の一部には既に科学的表記法が含まれていると最後に言いました。これは非常に簡単に処理できます。上記のクエリを更新しました。サイズはご試着ください。

SQL Server 2012 以降を使用している人にとって、この問題はおそらくTRY_PARSEで解決するのが最善です。

SELECT TRY_PARSE(Value AS float)

これにより、値はすべて float に変換されますが、その他の値については NULL が返されます。したがって、これを使用して、この式がIS NULL.

于 2013-06-11T22:03:47.170 に答える
0

次のカーソルを作成して、クエリが一度に 1 行ずつ実行されるようにしました。これにより、問題のあるデータ行を特定できました。

SET ARITHABORT OFF
SET ARITHIGNORE ON
SET ANSI_WARNINGS OFF

DECLARE @msg VARCHAR(4096)

BEGIN TRY

    DECLARE @itemid AS NVARCHAR(255);

DECLARE C CURSOR FAST_FORWARD FOR
    SELECT ItemID AS itemid
    FROM dbo.qryOtherFieldDataVerifySource;

OPEN C;

FETCH NEXT FROM C INTO @itemid;

WHILE @@fetch_status = 0
BEGIN

    SELECT  dbo.qryOtherFieldDataVerifySource.ItemID, dbo.qryOtherFieldDataVerifySource.EDGRDataID, dbo.qryOtherFieldDataVerifySource.LineItemID, 
            dbo.qryOtherFieldDataVerifySource.ZEGCodeID, dbo.qryOtherFieldDataVerifySource.DataValue, dbo.tblBC.AcceptableValues, 
            dbo.qryOtherFieldDataVerifySource.DataUnitID, dbo.qryOtherFieldDataVerifySource.DataDate, dbo.tblBC.DataTypeID, 
            CASE WHEN DataTypeID = '{5951994B-BF47-4117-805D-B8F85FAB76A8}' AND ISNUMERIC(DataValue) = 1 THEN (CASE WHEN CAST(DataValue AS Float(8)) 
            >= 0 THEN 1 ELSE 0 END) ELSE 0 END AS ValidPositiveNumericValue, 
            CASE DataTypeID WHEN '{A6317BA5-F8FB-4866-A26B-24594650C2DC}' THEN (CASE UPPER(DataValue) 
            WHEN 'TRUE' THEN 1 WHEN 'FALSE' THEN 1 WHEN 'YES' THEN 1 WHEN 'NO' THEN 1 WHEN 'Y' THEN 1 WHEN 'N' THEN 1 WHEN '0' THEN 1 WHEN '1' THEN 1 ELSE
            0 END) WHEN '{5951994B-BF47-4117-805D-B8F85FAB76A8}' THEN ISNUMERIC(DataValue) ELSE 1 END AS ValidDataType, dbo.tblZEGCode.ZEGCode, 
            dbo.qryOtherFieldDataFieldName.FieldName
     FROM   dbo.qryOtherFieldDataVerifySource LEFT OUTER JOIN
            dbo.qryOtherFieldDataFieldName ON dbo.qryOtherFieldDataVerifySource.ItemID = dbo.qryOtherFieldDataFieldName.ItemID LEFT OUTER JOIN
            dbo.tblBC RIGHT OUTER JOIN
            dbo.tblZEGCode ON dbo.tblBC.BCID = dbo.tblZEGCode.BCID ON dbo.qryOtherFieldDataVerifySource.ZEGCodeID = dbo.tblZEGCode.ZEGCodeID
     WHERE dbo.qryOtherFieldDataVerifySource.ItemID = '' + @itemid + ''

    FETCH NEXT FROM C INTO @itemid;
END

CLOSE C;

DEALLOCATE C;

END TRY 
BEGIN CATCH
SET @msg = 'Failure occurred attempting to execute qryOtherFieldDataVerify.';
EXEC ApplicationManagement.dbo.spLogProcedureCall 
    @ObjectID       = @@PROCID,
    @AdditionalInfo = @msg;
RAISERROR(@msg, 0, 1);
END CATCH   

DECLARE @returnCode int
SET @returnCode = CASE WHEN @msg IS NOT NULL THEN 1 ELSE 0 END
SELECT @returnCode AS ErrCode;
于 2013-06-11T22:03:40.807 に答える
0

これを試してみてください -

SELECT
      s.ItemID
    , s.EDGRDataID
    , s.LineItemID
    , s.ZEGCodeID
    , s.DataValue
    , t.AcceptableValues
    , s.DataUnitID
    , s.DataDate
    , t.DataTypeID
    , ValidPositiveNumericValue =
        CASE WHEN DataTypeID = '{5951994B-BF47-4117-805D-B8F85FAB76A8}' AND ISNUMERIC(DataValue) = 1 
            THEN CASE WHEN CAST(DataValue AS FLOAT(8)) >= 0 THEN 1 ELSE 0 END
            ELSE 0
        END
    , ValidDataType =
       CASE 
        WHEN DataTypeID = '{A6317BA5-F8FB-4866-A26B-24594650C2DC}'
            THEN CASE WHEN UPPER(DataValue) IN ('TRUE', 'FALSE', 'YES', 'NO', 'Y', 'N', '0', '1') THEN 1 ELSE 0 END 
        WHEN DataTypeID = '{5951994B-BF47-4117-805D-B8F85FAB76A8}' 
            THEN ISNUMERIC(DataValue)
         ELSE 1
       END
    , c.ZEGCode
    , f.FieldName
FROM dbo.qryOtherFieldDataVerifySource s
LEFT JOIN dbo.qryOtherFieldDataFieldName f ON s.ItemID = f.ItemID
RIGHT JOIN dbo.tblZEGCode c ON s.ZEGCodeID = c.ZEGCodeID
LEFT JOIN dbo.tblBC t ON t.BCID = c.BCID 
于 2013-06-12T06:00:05.107 に答える