mssql에서 export하면 data만 되는거 같아서요. 혹시 stored procedure만 txt file로 export 할 수 없나요? 가끔 백업을 해야할 것 같아서요.
아래의 부분을 script.vbs로 하시고 argument에 맞게하여 실행하면 Procedure만 다운 받으실수 있습니다. 다만 2000이하에서만 가능합니다. '*************************************************************************************************** ' SQL DMO, File SystemObject, shell을 이용 Database Object별 Secript 생성 ' Argument 설명 ' arg 0 : saveRoot dir(local 또는 Unc) ' arg 1 : database Login Id ' arg 2 : database Login Pwd ' arg 3 : server name, server IP ' arg 4 : scripting을 할 데이터베이스 네임 ' ' Run Example :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ' prompt:\>cscript script.vbs "c:\script\" "sa" "youly92" "youlyN" "youlyDB" ' 확인 : c:\script '*************************************************************************************************** '변수들에 대한 개체 정의 Dim objArgs, objSql, fso, WshShell, objDb, dbName Dim ScriptDb, saveDir
Set objSQL = CreateObject("SQLDMO.SQLServer") Set fso = CreateObject ("Scripting.FileSystemObject") Set WshShell = CreateObject("WScript.Shell")
Set objArgs = Wscript.Arguments
saveDir = objArgs(0)
objSQL.LoginSecure = False 'Trust된 곳이라면 당연히 True가 되면서 Login pwd불필요 objSQL.Login = objArgs(1) objSQL.Password = objArgs(2)
'Server Connect 하삼 objSQL.Connect objArgs(3)
Set objDB = objSQL.Databases
If Not(fso.FolderExists(saveDir)) Then createFolder saveDir End If
scriptDb = objArgs(4)
If NOT(fso.FolderExists(saveDir & scriptDb)) Then createFolder saveDir & scriptDb End If
''''여기서 부터 개체 콜하기 시작 For each dbName in objDB If LCase(dbName.name) = LCase(scriptDb) Then ScriptOut dbName.StoredProcedures, "StoredProcs"
End If Next
''''이놈은 파일을 만들 sub proc Sub ScriptOut(object, foldername) For each item in object If item.SystemObject = False Then createFolder saveDir & scriptDb & "\" & foldername sFileName = saveDir & scriptDb & "\" & foldername & "\" & Replace(item.Name, "\", "-") & ".sql" ' MsgBox item.Script If IsNull(item.script) Or IsEmpty(item.script) Then Else If IsNull(sFileName) Or IsEmpty(sFileName) Then Else item.Script 4, sFileName End If End If End If Next End Sub
''''이놈은 폴더를 만들 sub proc 'fso의 약간의 버그로 인한.. Sub createFolder(fName) If NOT(fso.FolderExists(fName)) Then WshShell.Run "cmd /c md " & fName WScript.Sleep 1000 End If End Sub
mssql에서 제공해주는 툴/유틸이 없는거 같아서요. 이 방법 저방법 해보다가 결국은 vbs 짰네요. 다른 분들 참고하세요. 그냥 급하게 작성해서 써먹은거라 좀 코딩이 이뿌지는 않습니다. 밑에 잘못한거 있을 수 있구요. 상황에 맞춰서 바꿔 쓰시면 되실 것 같습니다. 그리고 아래 서너네임, 디비네임이랑 아뒤패스워드 바꾸시는거 잊지 마시구요.
'********************************************************************** ' Visual Basic ActiveX Script '************************************************************************
Function Main() ExportStoredProcedure "DataBaseName","C:\Util\DP_RE" Main = DTSTaskExecResult_Success End Function
Function ExportStoredProcedure(sDatabase,path) Set fso = CreateObject("Scripting.FileSystemObject") If not fso.FolderExists(path) Then msgBox "The folder path is invalid. Please, Check the folder path and try again." Exit Function End If
dim sql sql = "SELECT dbo.syscomments.id, dbo.syscomments.colid, dbo.syscomments.text" & _ " FROM dbo.syscomments " & _ " INNER JOIN dbo.sysobjects ON dbo.syscomments.id = dbo.sysobjects.id" & _ " WHERE (dbo.sysobjects.xtype = 'p')" & _ " ORDER BY dbo.syscomments.id, dbo.syscomments.colid asc"
Dim ConnectionString, rs dim con
ConnectionString = "Provider=SQLOLEDB; Data Source=SERVERNAME; Initial Catalog=" & sDatabase & "; User ID=XXXX; Password=XXXX" set con=CreateObject("ADODB.Connection") con.open ConnectionString Set rs = CreateObject("ADODB.Recordset")
rs.Open sql, con Set FileWrite = fso.OpenTextFile(Path + "start.txt", 2, true)
Do While Not rs.EOF If rs(1) = 1 Then FileWrite.Close dim sql2 sql2 = "select dbo.sysobjects.name from dbo.sysobjects where dbo.sysobjects.id = " & rs(0) set rs2 = CreateObject("ADODB.Recordset") rs2.open sql2, con do while not rs2.eof Set FileWrite = fso.OpenTextFile(path & "\" & rs2(0) & ".sql", 2, true) rs2.MoveNext Loop rs2.close FileWrite.Write rs(2) else FileWrite.Write rs(2) end if rs.MoveNext Loop FileWrite.Close Set FrileWrite = nothing set rs2 = nothing
rs.Close con.close set rs = nothing set con = nothing End Function
'********************************************************************** ' END '************************************************************************