DMLトリガーに関数、パラメータにfrom Insertedは

rebootで書いた 一括insertがうまくいかない件は
https://docs.microsoft.com/ja-jp/sql/relational-databases/triggers/create-dml-triggers-to-handle-multiple-rows-of-data
これかな?
insertトリガーに仕込んだ関数のパラメータにselect from insertedと書いてるからと思う。
と言うか違いない。

VBA二次元配列

Public Function theSuccessTest()
Dim Str As String
Str = “a,b,c,d,e,f,g”

Dim Ary() As String
Ary = Split(Str, “,”)

Debug.Print UBound(Ary, 1)

Dim Ary2() As String
ReDim Ary2(0, 3)
Ary2(0, 0) = “a”
Ary2(0, 1) = “b”
Ary2(0, 2) = “c”
ReDim Preserve Ary2(1, 3)
Ary2(1, 0) = “d”
Ary2(1, 1) = “e”
Ary2(1, 2) = “f”

Debug.Print UBound(Ary2, 1)
Debug.Print UBound(Ary2, 2) 
End Function

こういう風に今までやってきたのだが検索すると
二次元の順番が逆?? 混乱

Public Function theFailureTest()

Dim Str As String
Str = “a,b,c,d,e,f,g”

Dim Ary() As String
Ary = Split(Str, “,”)

Debug.Print UBound(Ary, 1)

Dim Ary2() As String
ReDim Ary2(3, 0)
Ary2(0, 0) = “a”
Ary2(1, 0) = “b”
Ary2(2, 0) = “c”
ReDim Preserve Ary2(3, 1)
Ary2(0, 1) = “d”
Ary2(1, 1) = “e”
Ary2(2, 1) = “f”

Debug.Print UBound(Ary2, 1)
Debug.Print UBound(Ary2, 2)
End Function

いやいやこっちはなぜかできない
イメージはExcelの経時表
Accessのテーブルをイメージしたらだめ・・なのか?

reboot

開発中のDBアプリ、システム復元で3ヶ月分戻ってしまった。
バックアップしてるつもりがしてなかった
一ヶ月ほど呆然としていたがリブートです。

sqlserverでselectした結果をinsertですが
トリガーでカラムに関数など仕込んでいるとうまくいかない
トリガーのwhere条件を 
where id=(select id from inserted)
から
where id in(select id from inserted)
にすればよいのだが
ほかがうまくいかない

wordpressは設定で日本語にすれば簡単に日本語にできるのですね
今日気がつきました。

型変換と文字抽出

VBAでは
型変換は
CstrとかCintなど
文字抽出は
mid関数

SQLServerでは
型変換は
cast(文字列 as nvarchar) など
文字抽出は
substring(文字列,i,n)
iは最初の文字位置 最初の文字を1 nは文字数
最後まで抽出はnを100とか1000とか大きめに書きます

format

SQLServerでもfromatと以前UPしましたが
馴れているVBAのformatとは大分違っている事に気がつく
今日2017/10/27の日付で
select format(getdate(),’D’) 2017年10月27日
select format(getdate(),’d’) 2017/10/27
select format(getdate(),’m’) 10月27日
select format(getdate(),’M’) 10月27日
select format(getdate(),’y’) 2017年10月
select format(getdate(),’Y’) 2017年10月
select format(getdate(),’DD’) DD
select format(getdate(),’dd’) 27
select format(getdate(),’MM’) 10
select format(getdate(),’mm’) 40(現在時の分)
select format(getdate(),’YY’) YY
select format(getdate(),’yy’) 17
select format(getdate(),’yy/mm/dd’) 17/01/27 01は現在時刻の分
select format(getdate(),’yy/MM/dd’) 17/10/27

最後のはどうにも変
VBAではどうかというと
debug.Print format(now,”D”) 27
debug.Print format(now,”d”) 27
debug.Print format(now,”m”) 10
debug.Print format(now,”M”) 10
debug.Print format(now,”Y”) 300 300はなんだかわからない
debug.Print format(now,”y”) 300
debug.Print format(now,”DD”) 27
debug.Print format(now,”dd”) 27
debug.Print format(now,”mm”) 10
debug.Print format(now,”MM”) 10
debug.Print format(now,”yy”) 17
debug.Print format(now,”YY”) 17
debug.Print format(now,”yy/mm/dd”) 17/10/27
debug.Print format(now,”yy/MM/dd”) 17/10/27

かなり違う
ではVBAで分はというとn
select format(getdate(),’MM’) = debug.Print format(now,”nn”)

続MERGE ODBCエクスポート

MERGEの続き。前回の
TableAはSQLServerのテーブルで
TableBはMySQLのテーブルです。

TableBはフロントエンドにMSAccess2016がありますので
VBAからDoCmd.TransferDatabaseでODBCエクスポート
リンクテーブルですがAccessがなんとかしてくれるでしょう

DoCmd.TransferDatabase acExport, “ODBC データベース”, “接続文字”, acTable, “TableB”, “TableB_sql”, False

https://msdn.microsoft.com/ja-jp/library/office/ff196455.aspx

接続文字は面倒くさければリンクテーブルをデザインビューで開いて
プロパティで接続文字がどこかに出ているはずです。
コピペで貼り付ける。

あとはSQLServerへ接続して
TableB_sqlがあればdropをexecuteメソッドで書いて
上のexportを書いて前回のmergeのクエリを書く。

SQLServerのストアドプロシージャに仕込んでおいて
VBAからcn.execute ”exec プロシージャ名” が良いかも

かなりな更新系のクエリのはずですがやはり早い。

MERGE

二つのテーブルを比較し同じレコードが
あればupdate なければinsert
VBAでならレコードセット取っていろいろとやってれば
できるんでしょうが長くなるしAccess上でとなると時間もかかりそうな
のでSQLServerでしたい

となるとMERGEという事になるらしいです。
クエリ一文で済みます、たぶん。

merge into dbo.TableA as A
using dbo.TableB as B
on
(A.ID=B.ID)
when matched then
update set
name=B.name,
kana=B.kana,
Email=B.Email
when not matched then
insert(id,name,kana,email)
values(
B.ID,
B.name,
B.kana,
B.Email
)
;

肝はIDが一意であるという事ですがDBで一意となると自然増加のIDに
なっている事が多いでしょうからTableAの自然増加は外す
それとやはりSQLServerとMySQL間でMERGEは無理なのでテーブルを
移行させておく準備が必要

updateとinsertを同時に行うのでupsertともいうらしい

ゼロフィル

そうゼロフィル 0fill です。

SQL Server では
7桁ゼロフィル
select right(‘0000000’+cast((27) as varchar),7)
もしくは
select right(‘0000000′ + format(27,’00’),7)

で良いのかな、一応合っているような

文字型で帰ってくるので注意

訂正 select right(‘0000000′ + format(27,’00’),7) はもっと簡単で良い?
format(27,’0000000′)
3桁なら
format(27,’000′)
これなら忘れない