SQL ServerのVarcharって、半角用なんですね。
サイズを50とかにすると、25文字しか入らないんですよ。
では、どうするかっていうと、NVarcharにすると、サイズと文字数が一致するみたいです。
自分も、何回か忘れてて失敗したことがありました。
そういう時って、既にデータが格納されていて作りなおすことが出来なかったりして、厄介な問題になります。
しかも、リリースした後にわかると現場に行かないと出来なかったり、手順書書いたりとか、面倒ですよね。
そこで、シロートでもボタン一つでなんとかするツールを現地に配布して、誰かにやってもらう方法が良いでしょう。
そこで、そういったことをするVBScriptを作ってみました。
以下を適当に ~.vbs なんて名前で保存して下さい。
LoadSQL "接続ユーザ","接続パスワード","サーバ名", "データベース名"
Sub LoadSQL( user, pass, server, dbname )
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFile = objFso.OpenTextFile("modify.sql", 1, False)
Dim SqlCmd
Do Until objFile.AtEndOfStream
SqlCmd = SqlCmd & objFile.ReadLine & vbCrLf
Loop
' サーバーに接続します。
Set CN = CreateObject("ADODB.Connection")
CN.ConnectionString = "Provider=SQLOLEDB;" & _
"Data Source=" & server & ";" & _
"Initial Catalog=" & dbname & ";" & _
"User Id=" & user & ";" & _
"Password=" & pass & ";"
CN.Open
SET Cmd = CreateObject("ADODB.Command")
Cmd.ActiveConnection = CN
Cmd.CommandTimeout = 600 ' タイムアウト値
On Error Resume Next
Cmd.CommandText = "DROP PROCEDURE hogehogeproc"
Cmd.Execute
Cmd.CommandText = SqlCmd
Cmd.Execute
Cmd.CommandText = "exec hogehogeproc"
Cmd.Execute
CN.Close
End Sub
以下をmodify.sql で保存して下さい。
CREATE PROCEDURE hogehogeproc AS
CREATE TABLE HogeHogeTable2 (
MEMBER_ID INT NOT NULL,
NAME1 VARCHAR(30) NULL,
NAME2 VARCHAR(30) NULL,
PRIMARY KEY(MEMBER_ID)
)
insert HogeHogeTable2 select * from HogeHogeTable
drop table HogeHogeTable
CREATE TABLE HogeHogeTable (
MEMBER_ID INT NOT NULL,
NAME1 NVARCHAR(30) NULL,
NAME2 NVARCHAR(30) NULL,
PRIMARY KEY(MEMBER_ID)
)
insert HogeHogeTable select * from HogeHogeTable2
drop table HogeHogeTable2
この2つのファイルを一つのフォルダに、まとめて、最初の~.vbsを実行すれば移行してくれます。
修正点)
vbsファイルの「接続ユーザ」、「接続パスワード"」、「サーバ名」、「データベース名」は、接続情報ですので、書き換えて下さいね。
modify.sqlの中身は、HogeHogeTableのNAME1とNAME2をNVARCHAR(30)に変更するSQL文ですので、移行したいテーブルに合わせて修正して下さいね。
それと、あんまりでかいテーブルだと、トランザクションが完了しないかもしれないので、小分けにする等して工夫しましょうね。
後、外部制約なんかがあったりすると、ドロップ出来なかったりするんで、一旦外部制約を外すなりのSQL文も必要です。