文字

文字は難しい
SQLserverでカラムの型 nvarchar(76) 76は76バイト
全角一文字2バイトだから38文字はいるはず。
38文字以上入力してエラー時の挙動確認しようと思ったら
50,60文字入力してもエラーなし

どういうこと?

正解はnvarcharはunicode文字列 全角、半角区別なし
なのでnvarchar(76)は全角文字76文字入るということらしいです

思い出した、rs.recordcountは

Rs.recordcountは件数が多いと遅くてイライラした記憶が。

Dim i as long,MyCount as long

rs.movefirst
i=1
do until rs.eof
rs.movenext
i=i+1
Loop
MyCount=i

コードが長くなるけどこちらが速かったような

レコードセット

vbaからレコードセット取る時カーソルタイプはdynamicが多いのだが
件数rs.recordcountは取得できない。
カーソルタイプのおさらい
dynamicは全機能、もちろんaddnew、delete、更新できる
keysetもだいたい全機能 ただし他のユーザーの削除、追加は見えない、
staticは他のユーザーの追加、更新削除は見えない、追加更新削除できない、移動は自由
forwardonlyもstatic同様だが移動がmovenextのみ
件数取得はstaticとkeysetで可能
adopenkeyset,adlockoptimistic でだいたいOKなのかな

VBAエディターで

AccessのVBAで
dim A,B,C,D as String
と宣言したら A,B,C,D 全部Stringだと思っていたら
StringになっていたのはDだけで
A,B,CはVariant たぶん

今まではたまたまうまくいっていただけでした。
先ほど気がつきちょっとショック
まだまだ未熟なり

string_agg と string_split

SQLserverでGroup concatみたいな、縦の列のCSVみたいなことは以前書いた様に
for xml path を使ってできていたのですが何度見ても難解で覚えられないクエリでした。

SQLserver2017 からはstring_agg関数で
string_agg(column,’,’) within group (order by Seqcolumn asc)
などと簡単にできる様になりました。
これならなんとか覚えられそうです。

これでCSVを作っておいて
select * from string_split(‘CSV’,’,’)
とかやれば配列みたいなこともできそうな・・
ついでに何番目の要素とかも返してくれる関数があるとありがたいのですが今のところなさそうです。
文字列操作でできるとは思いますが何万列とかになると負荷高すぎてだめかな、たぶん。
IDのあるテーブルにinsertすればよさげな気がする。

string_agg は文字列を返しますが
string_split テーブルで返ってきます。 

とかく日付は難しい

SQLserverでもMySQLでもVBAでも
2018/1/1を文字の様に’2018/1/1’とか”2018/1/1”とか書けば日付として認識してくれる
と思っていたけど日付の比較で・・

SQLserverで
select iif(‘2018/1/4’>’2018-1-1′,’true’,’false’)
はtrueと思っていたらfalseを返します。文字と認識?
もちろん
declare @ParamS datetime,@ParamE datetime
select @paramS=’2018-1-1′
select @ParamE=’2018/1/31′
select iif(‘2018/1/4′ between @paramS and @paramE,’true’,’false’)
ときちんと宣言代入すればtrueです。

あるいは
select iif(‘2018/1/4’>cast(‘2018-1-1′ as datetime),’true’,’false’)
はtrueです。
片方だけでも日付型にしてあげるともう一方も日付と見てくれるようです。

VBAでもMySQLでも同じ挙動でした。
MySQLにiif関数はないのでnullif関数で
select nullif(‘2018-1-4′,’2018/1/4’);
select nullif(‘2018-1-4’,cast(‘2018/1/4′ as datetime)); 
で確認
上は別物と見なされ’2018-1-4’
下は同一と見なされnull
です。