型変換と文字抽出

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′)
これなら忘れない