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文も必要です。

 

 

Joomla templates by a4joomla