sql >> データベース >  >> RDS >> Sqlserver

CTE 戻りエラー

    SQL ServerSELECT ステートメントの論理処理順序 があります。 、あるステップで定義されたオブジェクトが後続のステップの句でいつ使用可能になるかを決定します:

    1. から
    2. オン
    3. 参加
    4. どこ
    5. GROUP BY
    6. キューブ付きまたはロールアップ付き
    7. 持っている
    8. 選択
    9. 明確
    10. 順番
    11. トップ

    これがクエリの処理方法であり、クエリは完全に正常に見えます。しかし、時々、SQL Server クエリを最適化するために、この順序に従わないことにしました。

    あなたの場合、SQL Server 単純にクエリを別のクエリに変更/変換して convert を実行している可能性があります where isnumeric を適用する前の関数 フィルタリング。

    クエリをもう少し複雑にすると (それでも同じ結果が得られます)、SQL Server 今度はコードが正しく実行されています:

    ;with isnum AS ( SELECT 結果 FROM #temp WHERE ISNUMERIC(結果) =1 GROUP BY 結果 HAVING MAX(結果) =結果)SELECT 結果、ISNUMERIC(結果)FROM isnumWHERE CONVERT(INT,結果)> 1;  

    あなたの場合 (そして、これは、さまざまな型が 1 つの列に格納されているような状況で私が行っていることです)、単に TRY_CONVERT 関数:

    ; with isnum AS ( SELECT result FROM #temp WHERE ISNUMERIC(result) =1)SELECT 結果、ISNUMERIC(result)FROM isnumWHERE TRY_CONVERT(INT, result)> 1  


    1. Laravelの雄弁なクエリビルダー-関係に関するグループとの合計

    2. Oracleの日付の正規表現

    3. 現在のレコード値に影響を与えることなく、既存の列に自動増分を追加します

    4. MySQLからほとんど重複するレコードを選択的に削除します