2

このステートメントが成功するのはなぜですか?

    SELECT CAST('08:50' as time)

でもこれ失敗?tmrecは nvarchar(6) 列であり、同じ値が含まれています'08:50'。これは、過去1時間から私を夢中にさせています。

    SELECT   TOP 1 CAST(tmrec as time) 
    FROM     Instr 
    WHERE    igrp = 'JD' 
    ORDER BY ino , smallin

このスクリーンショットは、最初のクエリの結果を示しています。08:50 が含まれています。それでも、2 番目のクエリはエラーをスローします。

編集:

これでも機能せず、フェッチされたレコードにのみ変換が適用されることが保証されます。

    SELECT CAST( tmrec as time)
    FROM
         (
            SELECT TOP 1 tmrec
            FROM   [ccwise-courts].[dbo].[INSTR]
            WHERE  igrp = 'JD' 
            ORDER BY ino , smallin
         ) v
4

1 に答える 1

3

通常、不良データを探すには、次のようなクエリを使用できます。

SELECT TOP(100) '-->' + REPLACE(tmrec, ' ', '*') + '<--bad'
FROM Instr
WHERE ISDATE(tmrec) = 0

それでもわからない場合は、関連する文字の特定の ASCII コードをリストアップできます (ここでは、質問ごとに 6 つまで上げます)。

SELECT TOP(100) '-->' + REPLACE(tmrec, ' ', '*') + '<--bad',
  Char1 = ascii(substring(tmrec,1,1)),
  Char2 = ascii(substring(tmrec,2,1)),
  Char3 = ascii(substring(tmrec,3,1)),
  Char4 = ascii(substring(tmrec,4,1)),
  Char5 = ascii(substring(tmrec,5,1)),
  Char6 = ascii(substring(tmrec,6,1))
FROM Instr
WHERE ISDATE(tmrec) = 0

WHERE フィルターが適用される前に、SELECT 句で CAST を処理する SQL Server を処理する、このConnect 項目があります。これを克服するには、バグ レポートにも記載されているように、CASE ステートメントを使用できます。

CAST(CASE WHEN ISDATE(tmrec)=1 THEN tmrec END as time)
于 2012-10-16T10:17:15.453 に答える