私自身がSQLserverを使っていて困った経験や、エラーなどに遭遇した時の事を備忘録としてPCTips5選を記事にしてみました。
テーブルに列を追加するとエラー
MSSMS(Microsoft SQL Server Management Studio)のテーブル デザイナーから手動変更を行うとしたところ、
ココに注意
変更の保存が許可されていません
というエラーメッセージ。
●対処方法
MSSMSの設定
[オプション]→[デザイナー]→[テーブル デザイナーおよびデータベース デザイナー]
にテーブルの再作成を必要とする変更を保存できないようにするがあるので、
ココがポイント
チェックを外す事でテーブル デザイナーから変更が可能
になる。
ただ、これがOFFのままだと、テーブル構成が変えられた時に追跡ができないので、マイクロソフトは非推奨にしているようだ。なので、クエリから追加や削除はしろということらしいが、初心者にはそんなことは面倒でできない。
そして、一回設計して運用が始まれば構成を変えることがないなら、そのままでも大丈夫のようだ。
でも、心配なので、OFFにして、修正したら、ONに戻しておくことにする。
インポートエラー列リストIDENTITY_INSERT
SQLserverでデータをインポートしようとすると、
ココに注意
列リストを使用し、IDENTITY_INSERTをONにしてから実行
のエラーがでる。
どうも連番の設定がしているテーブルにデータを入れるときにコツがいるようだ。
結局下記のようなクエリにしたらOKになった。
[php] SET IDENTITY_INSERT mst_openparts ON INSERT INTO mst_openparts(GCD, PNO, 製品名コード, 順番, HNO, 品名コード, 品名, 型式, 部品数) SELECT GCD, PNO, 製品名コード, 順番, HNO, 品名コード, 品名, 型式, 部品数 FROM [マスタ>部品展開] SET IDENTITY_INSERT mst_openparts OFF [/php]
つまりは、細かく列を
GCD, PNO, 製品名コード, 順番, HNO, 品名コード, 品名, 型式, 部品数
のように設定しないとエラーになるようだ。
YesNo型の処理
Accessでは普通に使っていたYesNo型だが、SQLserverでやろうとすると訳の分からないエラーがでる。
データの競合とか怒られたりした。
●うまく行った流れを解説
- SQLserver側では、bit型にして、すべてに最初”0”を書き込んでチェックされてない状態にした。
- そして、新規で増えた時にもNULLにならないように、テーブル構成で、規定値に”0”をいれた。なので、SSMSでの列の表示では、bit,NULL以外となっている。
- そして、Access側では、リンクテーブルを張り直して、デザインモードでテーブルを開けようとすると、変更はできないよって怒られるが、無視して進む。
- データ型を Yes/No型にして、ルックアップは、チェックボックスにする。
これでOKである。
チェックすると、SQLserverのテーブルには、”1”が書き込まれていた。
チェックボックスの時は注意が必要ですね。
データ追加でキー違反
オートナンバー付の、SQLserverテーブルにデータを追加すると、
注意ポイント
キー違反でエラー
がでる。
原因は、オートナンバーが悪さをしていると勝手に思い込んでいたが、ほかのフィールドに含まれていたYesNo型。
Sqlserver では、
ポイント
bit型 これは、NULLが許可されない
つまり、すべてに”0”を書き込んで未チェック状態にしておかなければならない。
そこで、テーブル追加クエリにて、エラーを起こした原因のフィールドに、” 0”を追加することで回避できた。
値の結合でエラー
ある値を結合させて一つの値にしたいとおもっていろいろとやったが、
注意ポイント
オーバーフローがどうのこうのっていうエラー
で先に進めなくなってしまった。
調べたら、
ポイント
型が違っていたので、オーバーフローを起こしていた
ようです。
だったら、エラー表示を「型が違います!」と表示してほしいものです。
最初は、下記の様にしていたらエラーが出ていました。
format(GETDATE(), 'yyyyMMddHHmm')) + '-' + NO + '-' + 手順
それを
CONVERT (varchar, format(GETDATE(), 'yyyyMMddHHmm')) + '-' + CONVERT (varchar, NO) + '-' + CONVERT (varchar, 手順)
のようにしたら、エラーが出なくなった。
原因は、GETDATEで日付が、数値型になっていたのに、ハイフンとかで文字コードになってさらに他は、数値型・・・というバラバラだったのでエラーが出たようです。
なので、CONVERT であわせれば問題解決です。