SQLの窓

2009年10月27日


VBS : SQLServerよりExcel へエクスポート(Excel製品は必要ありません)

Microsoft.Jet.OLEDB.4.0の利用
要は Microsoft 中心に考えると、たいていの DB に動的に接続して、テーブルを参照できるという事です。( ODBC ドライバ依存 )

Oracle は、常に、スキーマで修飾が必要ですが、他の DB ならテーブル名のみで参照できると思います。

結合もできるところが凄いというか、Microsoft 中心というか結構使い道が広い方法です。

ADOX は、他にも機能もありますが、ADO でたいてい事足りるので、MDB を作成したい場合にのみ利用します。

ADO は、MDB も Excel も 製品をインストールしていなくても DB として使うのならば何も問題無くアクセス可能です。つまり、Access や Excel をインストールしていなくても、ADO 経由でデータを見る事ができます
Set Cn = CreateObject( "ADODB.Connection" )
Set Fso = Wscript.CreateObject( "Scripting.FileSystemObject" )

' **************************************
' 実行中ディレクトリの取得
' **************************************
strPath = Wscript.ScriptFullName 
Set objFile = Fso.GetFile( strPath )
strCur = Fso.GetParentFolderName( objFile )

on error resume next
Fso.DeleteFile(strCur&"\DUMMY.mdb")
on error goto 0

Set ac = CreateObject("ADOX.Catalog")

' **************************************
' 接続用 MDB 作成
' **************************************
on error resume next
ac.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _
	"Data Source="&strCur&"\DUMMY.mdb"&";"
if Err.Number <> 0 then
	Wscript.echo Err.Description
	Wscript.quit
end if
on error goto 0

' **************************************
' 作成したMDB の開放
' **************************************
on error resume next
Set ac = Nothing
on error goto 0

' **************************************
' 接続文字列( ADOX と同じ )
' **************************************
ConnectionString = _
	"Provider=Microsoft.Jet.OLEDB.4.0;" & _
	"Data Source=" & strCur&"\DUMMY.mdb" & ";"

' **************************************
' 接続
' **************************************
on error resume next
Cn.Open ConnectionString
if Err.Number <> 0 then
	WScript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **************************************
' エクスポート用 SQL / {SQL Server} は
' {SQL Native Client}に変更可
' **************************************
Query = _
"select * " & _
" into [Excel 8.0;DATABASE="&strCur&"\商品マスタ.xls"&"].[商品マスタ] " & _
" from [ODBC;Driver={SQL Server};" & _
"SERVER=.\SQLEXPRESS;Database=lightbox;UID=sa;PWD=password].[商品マスタ]"

' **************************************
' 実行
' **************************************
Cn.Execute Query

' **************************************
' MDB 開放
' **************************************
Cn.Close
Set Cn = Nothing

' **************************************
' 接続用 MDB 削除
' **************************************
on error resume next
Fso.DeleteFile(strCur&"\DUMMY.mdb")
on error goto 0

Wscript.echo "処理が終了しました   " 




posted by lightbox at 2009-10-27 16:59 | SQLExpress | このブログの読者になる | 更新情報をチェックする

SQLServer のドキュメント

ドキュメントダウンロード
オンラインでも見れますが Microsoft のサイトはサクサクは無理です。
ローカルの PC にインストールしたほうが良いです。

SQL Server 2005 Books Online


オンライン参照
それでも、自分が使う PC 全てにインストールするわけにもいかない
ので、オンラインで見れるようにする事も重要です。

1) Transact-SQL リファレンス
2) コマンド プロンプト ユーティリティ
3) システム ストアド プロシージャ (Transact-SQL)
  ● sp_helpdb (Transact-SQL)


関連する記事
SQL-DMO CSV入出力
bcp.exe を使用した CSV 入出力
xp_cmdshell でストアードプロシージャを知る
SQLの窓1.5(改)でTransact-SQLを学ぶ







posted by lightbox at 2009-10-27 08:43 | SQLExpress | このブログの読者になる | 更新情報をチェックする

2009年10月26日


VBS : SQLExpress(SQLServer) テーブルの正しい CREATE 文を取得する

概要

有償版の SQLServer ならばこんな苦労はしなくてもいいはずですが、SQL-DMO はこれ以外にも有用な処理がたくさんあるので、使えるにこした事はありません。

バックアップやリストアは、SQL から実行したほうが便利なので BCP と共に最も良く使う SQL-DMO の処理だと思います
if exists(select * from sysobjects where name = '商品マスタ' and type = 'U')
	drop table 商品マスタ
;
CREATE TABLE [商品マスタ] (
	[商品コード] [varchar] (4) COLLATE Japanese_CI_AS NOT NULL ,
	[商品名] [nvarchar] (50) COLLATE Japanese_CI_AS NULL ,
	[在庫評価単価] [int] NULL ,
	[販売単価] [int] NULL ,
	[商品分類] [varchar] (3) COLLATE Japanese_CI_AS NULL ,
	[商品区分] [varchar] (1) COLLATE Japanese_CI_AS NULL ,
	[作成日] [datetime] NULL ,
	[更新日] [datetime] NULL ,
	 PRIMARY KEY  CLUSTERED 
	(
		[商品コード]
	)  ON [PRIMARY] 
) ON [PRIMARY]
;


これは、出力した結果ですが if 文と削除のところは自前で作成しています。SQLExpress( SQLServer )のSQL実行は、セミコロンで文を区切って一度に実行できるので、上記 SQL は一回の呼び出しで実行可能です

関連する記事

PHP : SQLExpress(SQLServer) : SQL-DMO(COM) による CSV 出力

Set Fso = CreateObject( "Scripting.FileSystemObject" )
' ****************************************
' 定義テキスト取得
' ****************************************

Server = "NIGHT_TCP"		' 別名
Db = "lightbox"
User = "sa"
Pass = "passwordpassword"

ListTable = "社員マスタ,商品マスタ,得意先マスタ"
List = Split( ListTable, "," )

Dim objServer,objDatabase,objTable

' ****************************************
' オブジェクト作成
' ****************************************
on error resume next
Set objServer = CreateObject("SQLDMO.SQLServer")
if Err.Number <> 0 then
	Wscript.Echo "SQL-DMO はインストールされていません"
	Wscript.Quit
end if
on error goto 0

' ****************************************
' 接続
' ****************************************
on error resume next
Call objServer.Connect( Server, User, Pass )
if Err.Number <> 0 then
	Wscript.Echo "接続に失敗しました [" & Err.Description & "]"
	Wscript.Quit
end if
on error goto 0

' ****************************************
' データーベースオブジェクト取得
' ****************************************
on error resume next
Set objDatabase = objServer.Databases(Db)
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0


' ****************************************
' テキストファイル
' ****************************************
Set OutObj = Fso.OpenTextFile( "create_script.sql", 2, True )


' ****************************************
' テーブルオブジェクト
' ****************************************
on error resume next
For i = 0 to Ubound( List )

	Set objTable = objDatabase.Tables(List(i))
	if Err.Number <> 0 then
		Wscript.Echo Err.Description
		Wscript.Quit
	end if

	strDrop = "if exists(select * from sysobjects where name = '"
	strDrop = strDrop & objTable.Name & "'" & " and type = 'U')" & vbCrLf
	strDrop = strDrop & "	drop table " & objTable.Name & vbCrLf
	strDrop = strDrop & ";" & vbCrLf

	OutObj.Write strDrop 
	OutObj.Write Replace( objTable.Script() & "", "GO", ";" ) & vbCrLf

Next
on error goto 0

OutObj.Close()

' ****************************************
' 切断
' ****************************************
Call objServer.DisConnect()



posted by lightbox at 2009-10-26 00:38 | SQLExpress | このブログの読者になる | 更新情報をチェックする

2009年10月25日


PHP : SQLExpress(SQLserver) : COM による接続処理

概要

要するに ADO です。ADO はかなり信頼性のある安定した Windows におけるDB 処理の為の
選択肢です。PHP における COM は完璧ではありませんが、PHP 側のインターフェイスを使
うより、慣れている者にとっては問題点が容易に予想でき、既存のコードもあるていど
そのまま利用できるという長所があります。

一部日本語列名を使った参照に問題が出るので、連想配列に入れなおす必要がありますが、
この部分で他のキャラクタセットの対応が出来ますし、オリジナルオプションを付加する
チャンスでもあります
posted by lightbox at 2009-10-25 22:33 | SQLExpress | このブログの読者になる | 更新情報をチェックする

2009年10月24日


PHP : PDO : SQLExpress(SQLServer)の読み込みと同時更新

前提条件
Visual Studio をインストール時にインストールされた SQLExpress の
設定は以下を参考にして下さい
SQLExpress 2005 の接続設定

単独でダウンロードしてインストールした場合は、上記ページと以下を参考にして下さい
SQLExpress 2005 のインストールから最速設定 

その上で以下よりデータとスクリプトをダウンロードしてテーブルを作成して下さい
VBS : SQLExpress(SQLServer) に 販売管理B を作成する 

上記販売管理Bの社員マスタには、生年月日が無いので以下の SQL を実行して下さい
alter table [社員マスタ] add 
	[生年月日] DATETIME

概要
PHP でデータベースにアクセスする場合、PDO を使用すると接続部分を変更するだけで、
一般的な処理ならば他のDBでも同じコードで済むというメリットがあります。
ただ、PHP は フリーソフトなので、データベースに対する対応については、利用する側
が十分に考察する必要があります。

PDO の SQLServer に対する見解として、オンラインマニュアルで以下のような記述を
見る事ができます
Windows では、Microsoft SQL Server や Sybase データベースにアクセスする際には
PDO_ODBC ドライバを使用すべきです。 Windows 版のネイティブの DB-LIB は時代遅れになっており、
スレッドセーフではない上に Microsoft にもサポートされていません。
要するに、PDO で SQLExpress で接続する場合は ODBC を使えという事です。
実際問題として、Windows では COM を使っても十分動きますし、SQLServer 特有の
処理は、おそらく SQL-DMO を COM 経由で処理すると動くと思いますし、一般的
な処理であれば、ODBC を使うのが最も安全でしょう
posted by lightbox at 2009-10-24 23:11 | SQLExpress | このブログの読者になる | 更新情報をチェックする

2009年10月22日


ODBC 用 JDBC : 動的接続 / SQLExpress(SQLServer) / 読み込みながらの行更新

概要

結局更新する為に接続が二つ必要でした。
フィールド単位のデータセットはうまくいかず、結局SQLを作成する
のがやはり無難という結果です

列データの取得、保存、読み出し等はクラスにすべきですが、
この先はサンプルとしては効果が薄いのではしょりました。
posted by lightbox at 2009-10-22 17:34 | SQLExpress | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり