SQLserver 連番をリセットする方法

連番設定してあると、データを消した時に、その連番が保持されていて次からの発番になる。
1からスタートしたい場合は、下記のクエリを実行すればリセットされる。

IDENTITYプロパティを設定した列のID値を初期化(リセット)する方法

— ID値を0に設定
DBCC CHECKIDENT (‘tablename’, RESEED, 0);

— ID値を100に設定
DBCC CHECKIDENT (‘tablename’, RESEED, 100);

SQLserver 既存のテーブルに連番を振りたい

簡単そうでできない事だったので備忘録にする。

主キーが無いと更新ができないのだが、テーブル上、主キーにしたいキーが重複しているので新たな主キーがないとテーブルの役目を果たせなくなってしまった。

そこで、Accessで言うオートナンバーを探した。なんだか難しかったので、Excelでそのレコードの番号を作成して、テーブルに貼り付ければいいやって簡単に考えていたが、貼り付けができない。
※貼り付けボタンがONにならない。
結局諦めて別の方法で回避できたので、その方法を書く。

(1)SQLserverの連番を振りたいテーブル(以下テーブルB)の構造を開いて、新しいテーブル(以下テーブルA)を作成する。
全く同じ構造で中身がないテーブルを作成する。

(2)主キーにするための、列(以下CD)をテーブルAに追加する。

(3)テーブルAの主キーにする列(CD)のプロパティを開いて、「IDENTITYの指定」を(IDである)を”はい”にする。そうすると、(IDの増分)が勝手に1になり、1づつ連番が振られる設定になるようだ。

(4)後は、クエリを動かして、インサートすれば、自動で連番が振られている。

INSERT INTO テーブルA
(PNO, 製品名コード, 順番, HNO, 品名コード, 品名, 型式, 部品数)
SELECT PNO, 製品名コード, 順番, HNO, 品名コード, 品名, 型式, 部品数
FROM テーブルB

テーブルBのデータをテーブルAに丸ごとインサートしている。
テーブルAは、CD,PNO, 製品名コード, 順番, HNO, 品名コード, 品名, 型式, 部品数
なのだが、CD列内に自動で連番が振られることになる。

ちなみに、列をいちいち手入力でやるのは面倒なので、クエリデザイナーを上手につかって選択入力してから、手を加えて整形した。

SQLserver 別テーブルの値で更新

UPDATE mst_openparts
SET   PNO = mst_product.PNO
FROM mst_openparts INNER JOIN
mst_product ON mst_openparts.製品名コード = mst_product.製品名コード

mst_openpartsのテーブルの中のPNOのフィールドが空なので、mst_productの製品名コードから、PNOを引っ張って更新した。

ほとんどクエリエディターで作成して、mst_product.PNO の部分だけ追加した。

これで空だったPNOフィールドにデータが入った。

Access VBA エラー処理

Function TEST()
On Error GoTo Error ‘ エラー処理を行います。
Err.Raise 11 ‘ 0 による除算エラーを強制的に発生させます。
Exit Function ‘必ず必要です。

Error:
‘ エラー情報を表示します。
MsgBox “エラー番号:” & Err.Number & vbNewLine & _
“エラー内容:” & Err.Description
‘ エラー発生後、次のステートメントから処理を再開します。
Resume Next
End Function

VBAの中にエラーが出た時は、下記の2行でエラーがでそうな内容部分を囲めばOK

On Error GoTo Error
Error:

Access 指定枚数のラベルを印刷

テーブルに「プリント枚数」という印刷枚数を数値で入れておくフィールドをつくる。レポートをデザインモードにして。

(1)レポートの中に、非表示にてその枚数フィールドを入れておく。

(2)非連結の[Text1]というテキストボックスを設置して、非表示にしておく。

(3)詳細のプロパティを開き、「フォーマット時」のイベントプロシージャを開く。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
Dim 指定枚数 As Integer
指定枚数 = Me!プリント枚数
If IsNull([Text1]) Then [Text1] = 1
If [Text1] <> 指定枚数 Then
Me.NextRecord = False
Me.MoveLayout = True
Me.PrintSection = True
End If
End Sub

(4)同じく「印刷時」のイベントプロシージャを開き
Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
指定枚数 = Me!プリント枚数
If [Text1] <> 指定枚数 Then
[Text1] = [Text1] + 1
Else
[Text1] = 1
End If
End Sub

これで、印刷プレビューすれば、プリント枚数に入っている数値の枚数だけラベル印刷される。

SQLserver クエリデザイナー インディックスが配列の境界外

テーブルの更新がしたくて、新しいクエリを選択して、編集モードにして、クエリデザイナーを開くと、
インディックスが配列の境界外・・・ってエラーで、追加するテーブルが表示されない。

GUIでクエリが作成したいと思っていたができない。

これは、ソフトのエラーらしくて、検索かけるとアップデートしろとか出てくる。

今回は、MSSMSのバージョンを新しくしたら直った。

もしかすると、サーバーを再起動したらどうだったのだろうか?

サーバーに接続しているMSSMSのバージョンは新しくしてないが大丈夫。不思議。

SQLserver YesNo型の処理

Accessでは普通に使っていたYesNo型だが、SQLserverでやろうとすると訳の分からないエラーがでる。

データの競合とか怒られたりした。その回避の備忘録

SQLserver側では、bit型にして、すべてに最初”0”を書き込んでチェックされてない状態にした。
そして、新規で増えた時にもNULLにならないように、テーブル構成で、規定値に”0”をいれた。
なので、MSSMSでの列の表示では、bit,NULL以外となっている。

そして、Access側では、リンクテーブルを張り直して、デザインモードでテーブルを開けようとすると、変更はできないよって怒られるが、無視して進む。

データ型を Yes/No型にして、ルックアップは、チェックボックスにする。これでOKである。

チェックすると、SQLserverのテーブルには、”1”が書き込まれていた。

チェックボックスの時は注意が必要ですね。

SQLserver リレーションシップ

SQLserverのリレーションシップってどうやるの?

調べると、リレーションシップという言葉自体が違くて、「データベースダイヤグラム」ってところに設定するらしい。

その上で右クリックして、「新しいデータベースダイヤグラム」ってのをやると、テーブルを選択する画面が出現する。

あとは、Accessとにている。テーブルを追加して、キーとなる項目を結合させる。

ところが、Accessでテーブルをフォームから接続して、追加はできたが、削除ができない。つまり、SQLserverの方で拒否っているようだ。

ということで調べると、データベースダイヤグラムのテーブル同士を接合している線上で、プロパティで開き

[INSERT および UPDATE の指定] ってのがあるので、そこで、更新ルール、削除ルールってのがあるので、削除ルールの方を「重ねて表示」に選択したら、メインテーブルのレコードを削除したら、リレーションされている子テーブルのレコードも削除することができた。

削除ルールの設定内容は、下記のようなことです。ちょっと説明自体が分かりにくい。

[動作なし] 削除操作が許可されていないことをユーザーに通知するエラー メッセージが出力され、DELETE がロールバックされます。
[重ねて表示] 外部キー リレーションシップに関係するデータを含む行がすべて削除されます。
[Null に設定] テーブルのすべての外部キー列が null 値を使用できる場合、null 値が設定されます。 SQL Server 2005 および SQL Server 2008 にのみ適用されます。
[既定値の設定] テーブルのすべての外部キー列に既定値が定義されている場合、既定値が設定されます。 SQL Server 2005 および SQL Server 2008 にのみ適用されます。

更新ルールの設定内容は、

[動作なし] 削除操作が許可されていないことをユーザーに通知するエラー メッセージが出力され、DELETE がロールバックされます。
[重ねて表示] 外部キー リレーションシップに関係するデータを含む行がすべて削除されます。
[Null に設定] テーブルのすべての外部キー列が null 値を使用できる場合、null 値が設定されます。 SQL Server 2005 および SQL Server 2008 にのみ適用されます。
[既定値の設定] テーブルのすべての外部キー列に既定値が定義されている場合、既定値が設定されます。 SQL Server 2005 および SQL Server 2008 にのみ適用されます。

SQLserver Accessにて「このレコードセットは更新できません」

SQLserverの方で主キーが設定ないとリンクテーブルにはったAccessの方で更新ができないエラーが発生することは分かっていたのですが、しばらく使ってないとまた同じような状況に出くわす。

今回もAccessにて「このレコードセットは更新できません」って怒られた。

主キーを設定して、やってみたが相変わらず直りません。

そこで、リンクテーブルを削除してリンクを貼り直したらすんなりいい子になった。

そうなのね。