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

SQLServerのコードページと照合

    実際、私は今私の質問に対する答えを見つけました。少し不格好ですが、もっと良い方法がない限り、仕事はできますか?

    SET NOCOUNT ON;
    
    CREATE TABLE #Collations
    (
         code TINYINT PRIMARY KEY
    );
    
    WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1),   --2
            E02(N) AS (SELECT 1 FROM E00 a, E00 b), --4
            E04(N) AS (SELECT 1 FROM E02 a, E02 b), --16
            E08(N) AS (SELECT 1 FROM E04 a, E04 b) --256
    INSERT INTO #Collations
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) - 1
    FROM E08    
    
    DECLARE @AlterScript NVARCHAR(MAX) = ''
    
    SELECT @AlterScript = @AlterScript + ' 
    RAISERROR(''Processing' + name + ''',0,1) WITH NOWAIT;
    ALTER TABLE #Collations ADD ' + name + ' CHAR(1) COLLATE ' + name + ';
    EXEC(''UPDATE #Collations SET ' + name + '=CAST(code AS BINARY(1))'');
    EXEC(''UPDATE #Collations SET ' + name + '=NULL WHERE ASCII(' + name + ') <> code'');
    '
    FROM   sys.fn_helpcollations()
    WHERE  name LIKE '%CS_AS'
           AND name NOT IN    /*Unicode Only Collations*/
                            ( 'Assamese_100_CS_AS', 'Bengali_100_CS_AS',
                             'Divehi_90_CS_AS', 'Divehi_100_CS_AS' ,
                             'Indic_General_90_CS_AS', 'Indic_General_100_CS_AS',
                                 'Khmer_100_CS_AS', 'Lao_100_CS_AS',
                             'Maltese_100_CS_AS', 'Maori_100_CS_AS',
                             'Nepali_100_CS_AS', 'Pashto_100_CS_AS',
                             'Syriac_90_CS_AS', 'Syriac_100_CS_AS',
                             'Tibetan_100_CS_AS' )
    
    
    EXEC (@AlterScript)
    
    SELECT * FROM #Collations
    
    DROP TABLE #Collations
    


    1. T-SQLを使用して、文字列からn番目に区切られた要素を返します

    2. PHPを使用してMySQLから過去3分間のレコードを選択する方法

    3. MySQLでストアドプロシージャを作成するときのSQL構文エラー

    4. トリガーから呼び出されたストアドプロシージャの動的ステートメントの回避策