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

文字列がuniqueidentifierであるかどうかを確認するにはどうすればよいですか?

    SQL Server 2012では、TRY_CONVERT(UNIQUEIDENTIFIER, expression)を使用してこれをすべて簡単に行うことができます。

    SELECT something
    FROM   your_table
    WHERE  TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
    

    以前のバージョンのSQLServerの場合、既存の回答はいくつかの点を見逃しています。つまり、SQLServerが実際にUNIQUEIDENTIFIERにキャストする文字列と一致しない可能性があります。 苦情なしで、またはそれでも無効なキャストエラーを引き起こす可能性があります。

    SQL Serverは、{}でラップされたGUIDを受け入れます またはこれなし。

    さらに、文字列の最後にある無関係な文字を無視します。両方のSELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier) およびSELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier) たとえば成功します。

    ほとんどのデフォルトの照合では、LIKE '[a-zA-Z0-9]' Àなどの一致する文字になります またはË

    最後に、結果の行をuniqueidentifierにキャストする場合、行がWHEREによってフィルタリングされる前にキャストが発生する可能性があるため、case式にキャストの試行を入れることが重要です。 。

    したがって、(@ r0d30b0yのアイデアを借りて)もう少し堅牢なバージョンになる可能性があります

    ;WITH T(C)
         AS (SELECT '5D944516-98E6-44C5-849F-9C277833C01B'
             UNION ALL
             SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}'
             UNION ALL
             SELECT '5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
             UNION ALL
             SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss'
             UNION ALL
             SELECT 'ÀD944516-98E6-44C5-849F-9C277833C01B'
             UNION ALL
             SELECT 'fish')
    SELECT CASE
             WHEN C LIKE expression + '%'
                   OR C LIKE '{' + expression + '}%' THEN CAST(C AS UNIQUEIDENTIFIER)
           END
    FROM   T
           CROSS APPLY (SELECT REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]') COLLATE Latin1_General_BIN) C2(expression)
    WHERE  C LIKE expression + '%'
            OR C LIKE '{' + expression + '}%' 
    


    1. データベースメールアカウントをプロファイルに追加する(T-SQL)

    2. OracleのNCHAR列またはNVARCHAR列に国別文字を挿入しても機能しません

    3. 私はsqliteからデータを取得してBaseAdapterにデータを表示するAndroidアプリを持っています..最良の方法は何ですか?

    4. ストアドプロシージャとは何ですか?なぜストアドプロシージャですか?