MS SQL Server

AccessからSQL Serverに移行していくつかハマりつつ解決策が何となく発見されたものについて。

NULLを含む列のユニーク化

普通にやるとNULL同士が重複しているとエラーになる。

本当ならNULLはNULLと重複しないのがSQLの規定のはずだが仕方がない。

インデックスを作成して、フィルターに IS NOT NULLを付ければNULL以外は重複禁止、ができるようだ

集計データ列

列に式を入れる方法。本当なら一意でないデータを1行内に入れるのはよろしくないのだが、ビューにすると更新とか面倒になったので数式で。

正式名と省略名があって省略名があれば省略名、無ければ正式名とする方法

CREATE TABLE 商品 (
正式名 nvarchar(20) NOT NULL,
省略名 nvarchar(10) NULL,
商品名 AS (ISNULL([省略名],[商品名]))

CREATE UNIQUE NONCLUSTERED INDEX
[商品正式名] ON [商品]( [正式名) ASC)

CREATE UNIQUE NONCLUSTERED INDEX
[商品省略名] ON [商品]( [省略名) ASC)
WHERE ([省略名] IS NOT NULL)

こんな感じで正式名はNOT NULLで重複禁止、省略名はNULL okで重複禁止、商品名ができるだけ短い名前、といったテーブルが作成できた

SQLServer Mangement Studio では、テーブルの構造から列のプロパティ内 計算式の指定で(ISNULL([省略名],[商品名])

テーブルのインデックスから新規作成もしくはプロパティで、フィルターにhoge IS NOT NULLを入れればOKでした

Accessが便利になっているのかSQLServerが固すぎるのか。

VPNの向こうのSQLServerにつなげているのもあって、Access単体の方が早くていじりやすくて楽だった・・・

CGI作成

知人に頼まれてクイズ形式のCGIを作ってみた。

とりあえず知っている言語 perl で書いてみて、やっている最中にデータの管理とか宣言ミスとか痛くなってきたので、もっといい言語は無いかと浮気し始める。

PHPはプログラムつーかHTML記述言語っぽくてなんか向いてない感じで、rubyはOOPしていて良さげだし、pythonはコンパイラもあってドキュメントも書きやすそうで結構良さげだったけど、

結局一度perlで書いたものを書き換えようとすると構造そのものから見直さなければならなくなってやめた(爆

気が向いたら他の言語で書いてみようとか思ったけどそんなことはクライアント(お客さん)は望んでいないのであった。ああ自己満足。

そうでなくても仕様をプログラマが勝手に変えてしまう状況で、これはいかんと久しぶりに仕様書まで書いてしまった。
仕様書しっかり書いてみるとプログラムの無駄な部分が見えてきたりしてイイネ!

プログラマやってた時にもっと勉強しておけばよかった。

それをやると今度は仕様書とプログラムの管理が面倒ということで一緒に書けるpythonはいいなーとか思いつつまだやっていないのであった。