row_number関数でupdate

row_numberやdense_rankは便利ですが
すでに連番カラムがあるテーブルの連番を付け直すには

UPDATE table
SET
SeqColumn = Buf.NewSeq
FROM
(
SELECT key1,key2
ROW_NUMBER() OVER
(PARTITION BY key1, key2 ORDER BY sortColumn DESC) AS NewSeq
FROM table
) AS Buf
WHERE
table.key1 = Buf.key1
table.key2 = Buf.key2

こんなかんじですがちょっと難しいし覚えられない。その都度Google先生にお聞きしている。
CTE、これもちょっと難しいのですがこれを使うと

 With MyCTE as
(
select *,
ROW_NUMBER() over(partition by key1,key2 order by SortColumn desc) as NewSeq from Table
)
update MyCTE set SeqColumn=NewSeq;

ぐっと簡単になった
これならなんとか覚えられそう

空白パディング@SQLserver

0パディング(0fill)は以前書いたけど
空白パディング、スペースフィルです。
いろいろ方法はあると思うけど
文字列 ’12345′
10桁で頭に空白パディング
select concat(space(10-len(‘12345′)),’12345’)

SQLserverの一時テーブルへの接続は競合しないのか?

答えはしないです。
フロントAccessでDBアプリを開発中ですが不安になりました。
レコードセット取らずにcn.executeで直接#テーブルいじってますので・・
クライアント2台で試してみました。

cn.Execute “drop table if exists #no123”
cn.Execute “select カラム into #no123 from テーブル where カラム like ‘%ほにゃらら%'”
rs.Open “select * from #no123”, cn, adOpenKeyset, adLockOptimistic
rs.MoveFirst
Do Until rs.EOF
MsgBox rs!カラム
rs.MoveNext
Loop

一台で操作途中でもう一台から同操作
競合するならdropされるはずですが大丈夫でした。
このときSQLserverはどうしているのかというと

一時テーブルが2つ出来ていました。
これは便利です

まだまだあった件数取得

こういうのもありですか
rs.Open “select count(主キー) as MyCount from テーブル where条件”, cn, adOpenStatic, adLockOptimistic
Debug.Print rs!MyCount

引き出しが少ないのでネタが尽きます
というか備忘録なのでご勘弁を

rs.Rcordcountは必ずしも遅くなかった

rs.recordcountが遅いかもの件です
5万件ぐらいのテーブルで確認してみました。
where条件にもよるのでしょうけど

rs.Open “select id from テーブル where条件”, cn, adOpenStatic, adLockOptimistic
Debug.Print rs.RecordCount

rs.Open “select id from テーブル where条件”,cn, adOpenStatic, adLockOptimistic
rs.Move first
i = 1
Do Until rs.EOF
rs.MoveNext
i = i + 1
Loop
Debug.Print i

はrs.recordcountの2馬身ぐらいで勝ちでしたが

rs.Open “select id from テーブル where条件”, cn, adOpenStatic, adLockOptimistic
Debug.Print rs.RecordCount

rs.Open “select id from テーブル where条件”,cn, adOpenForwardOnly, adLockReadOnly
rs.Move first
i = 1
Do Until rs.EOF
rs.MoveNext
i = i + 1
Loop
Debug.Print i

はloopの圧倒的勝利でした。

rs.addnew rs.update など流れの中で件数取得ならrecordcount
件数取得だけが目的ならloopということかな?

vba二次元配列訂正再掲

Public Function theFailureTest()
Dim Ary() As String
ReDim Ary(0, 3)
Ary(0, 0) = “a”
Ary(0, 1) = “b”
Ary(0, 2) = “c”
ReDim Preserve Ary(1, 3)
Ary(1, 0) = “d”
Ary(1, 1) = “e”
Ary(1, 2) = “f”
Debug.Print UBound(Ary, 1)
Debug.Print UBound(Ary, 2) 
End Function

これはダメな例
なぜダメかはあとで・・
次に正しい例
Public Function theSuccessTest()
Dim Ary() As String
ReDim Ary(3, 0)
Ary(0, 0) = “a”
Ary(1, 0) = “b”
Ary(2, 0) = “c”
ReDim Preserve Ary(3, 1)
Ary(0, 1) = “d”
Ary(1, 1) = “e”
Ary(2, 1) = “f”
Debug.Print UBound(Ary, 1)
Debug.Print UBound(Ary, 2)
End Function
拡張できるのは最後の次元だけなので添字の変数は2番目に置く
理由は難しそうだが

に書いてあります

vba二次元配列訂正

以前に二次元配列の順番がどうこうの事
一方を添字の変数にして
For i=0 to なんてやるのでああ書きましたが
順番は関係ないですね。
表を縦にして見るか横にして見るかみたいなもので
どちらもうまくいくはず
うまくいかないのは他の問題。

failureとsuccessが逆
単純な間違いでした。
やはり順番大事