SSブログ

ちょっとSQL文書く

備忘録的な的な

対象はSQL Server
試した環境はSQL Server2008 R2 Exp
テーブルの構造を取得する
列の型を取得する
--------SQL--------
SELECT
    T.name AS [TableName],
    C.column_id AS [ColumnNo],
    C.name AS [ColumnName],
    CASE 
        WHEN TY.name IN ('binary','varbinary')
            THEN TY.name + '(' + 
                CASE
                    WHEN C.max_length = -1 
                        THEN 'max'
                    ELSE
                        CAST(C.max_length AS nvarchar(10))
                END + ')'
        WHEN TY.name IN ('nvarchar','nchar')
            THEN TY.name + '(' + 
                CASE
                    WHEN C.max_length = -1 
                        THEN 'max'
                    ELSE
                        CAST(C.max_length / 2 AS nvarchar(10))
                END + ')'
        WHEN TY.name IN ('decimal','numeric')
            THEN TY.name + '(' + 
                CAST(C.precision AS nvarchar(10)) + 
                CASE
                    WHEN C.scale = 0
                        THEN ''
                    ELSE
                        ',' + CAST(C.scale AS nvarchar(10))
                END + ')'
        ELSE
             TY.name
    END AS [Type],
    CASE C.is_nullable
        WHEN 1 THEN 'false'
        WHEN 0 THEN 'true'
    END AS [NOTNULL],
    CASE WHEN F.index_column_id IS NOT NULL AND E.is_primary_key = 1 
        THEN 'true'
        ELSE 'false'
    END AS [PrimaryKey],
    CASE WHEN C.is_identity =0 
        THEN 'false'
        ELSE 'true'
    END AS [AutoNumber],
    CASE WHEN C.default_object_id != 0
        THEN D.definition
    END AS [DefaultValue]
FROM
    sys.tables T
    INNER JOIN sys.columns C
        ON T.object_id = C.object_id
    INNER JOIN sys.types TY
        ON TY.user_type_id = C.user_type_id
    LEFT OUTER JOIN sys.default_constraints as D
        ON C.default_object_id = D.object_id
    LEFT OUTER JOIN sys.indexes AS E
        ON T.object_id = E.object_id
        AND E.is_primary_key = 1
    LEFT OUTER JOIN sys.index_columns AS F
        ON T.object_id = F.object_id
        AND C.column_id = F.column_id
ORDER BY
    T.name,C.column_id
--------SQL--------
WHEREでT.nameにテーブル名で抽出すると対象のテーブルの構造が取得できる。
sys.tablesを変えるとsys.viewsに変えるとビューの構造が取得できる。


SQL文の中で配列を使う
--------SQL--------
DECLARE @Array table(num int unique, data varchar(50));
INSERT INTO @Array VALUES(0,'AAAA');
INSERT INTO @Array VALUES(1,'BBBB');
INSERT INTO @Array VALUES(2,'CCCC');

-- Length
SELECT COUNT(*) FROM @Array;

-- GetValue
SELECT data FROM @Array WHERE 0 = num;

-- 配列の中に存在するデータをテーブルのdataから検索する
SELECT * FROM hogeTable WHERE data IN (SELECT data FROM @Array);
--------SQL--------
テーブルを擬似的に配列として扱う方法


SQLで条件が無い場合全件検索を行い
条件がある場合は抽出を行う
抽出条件はORとする
--------SQL--------
-- 配列の中に存在するデータをテーブルのdataから検索する
-- 配列の中にデータが存在しない場合全件出力する
SELECT * FROM hogeTable
WHERE (((SELECT COUNT(*) FROM @Array = 0) OR data IN (SELECT data FROM @Array));
--------SQL--------
さっきの配列を使い回してる方法
@Arrayのテーブルが0件だと全件検索
データがあるとor検索
ORで接続することでショートサーキットを発生させ後ろの検索条件を無効にする


あとは
実際に試す環境が無いのであれだが…
Windows Vista/7、Server2008/2008R2から
Windows MobileとかCEのPDAとかでSQL Server Compact のsdfファイルを入れて開くと遅くなる現象を回避する案
現象内容
Windows XP Server2003で作ったsdfファイルは
WindowsConsoleアプリをC#で組んで
↓のコードでコンパイルする
できあがったexeを互換性モードのWindowsXPで動かす
SQLConnectStringは適当に変えて下さい
exeにsdfファイルをD&DすればREINDEXされるみたいです
一応Windows7上で適当に作ったsdfファイルで実行すると先頭3バイトと途中1バイトx4カ所が書き換わっていた
テーブルの構造にもよると思うけど…
レジストリからXPモード指定が出来るので方法はぐぐる
//--------C#--------
static void Main(string[] args)
{
    String FileName = null;
    FileName = String.Format("Data Source = '{0}'; Encrypt = FALSE;", args[0]);
    Console.WriteLine(FileName);
    using (SqlCeConnection con = new SqlCeConnection(FileName))
    {
        con.Open();
        con.Close();
    }
}
//--------C#--------
単純に開いて閉じるだけ
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

IS11SテザリングちょっとC#書く ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。