リモート マシン上の特定の SQL Server データベースに接続し、SMO を使用してその DB のすべてのオブジェクトのスクリプトを生成する IronPython (v2.7.3) モジュールに取り組んでいます。私の「実際の」モジュールには、SMO で定義されているすべてのオブジェクト タイプのスクリプトを生成するコードが含まれていApplicationRoles
ますXmlSchemaCollections
。私が使用しているDBはSQL Server 2000上にあります.117のテーブル、257のSP、101のビューなど、かなりの数のオブジェクトがあります.
モジュールを実行するたびに、SP をスクリプト化している時点でスタック トレースを取得します。テーブルと SP のみをスクリプト化するようにモジュールに切り詰めましたが、SP のスクリプト化中に失敗しました。縮小版は次のとおりです。
import sys, clr
import System.Array
serverName = r'x.x.x.x' #IP address of remote server
pathAssemblies = r'C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\SQLServer2008R2\x64'
sys.path.append(pathAssemblies)
clr.AddReferenceToFile('Microsoft.SqlServer.Smo.dll')
import Microsoft.SqlServer.Management.Smo as SMO
srv = SMO.Server(serverName)
srv.ConnectionContext.LoginSecure = False
srv.ConnectionContext.Login = 'sa'
srv.ConnectionContext.Password = 'foo' #Password of sa
db = srv.Databases['bar'] #Name of database
scrp = SMO.Scripter(srv)
sys.stdout = open('DBScriptOutput.txt', 'w')
try:
for dbgenobj in db.Tables:
urns = System.Array[SMO.SqlSmoObject]([dbgenobj])
outStr = scrp.Script(urns)
for outLine in outStr:print outLine
except:
print 'Failed out while generating table scripts.'
try:
for dbgenobj in db.StoredProcedures:
urns = System.Array[SMO.SqlSmoObject]([dbgenobj])
outStr = scrp.Script(urns)
for outLine in outStr:print outLine
except:
print 'Failed out while generating stored procedure scripts.'
ここで困惑したパズルには、意味をなさないように見える 2 つのことが含まれます。
(1) スタック トラック自体は次のようになります。
Traceback (most recent call last):
File "E:\t.py", line 33, in <module>
UnicodeEncodeError: ('unknown', '\x00', 0, 1, '')
ただし、33 行目はブロックprint
内のステートメントです。except
出力ファイルには、すべてのテーブルのスクリプト、235 の SP の完全なスクリプト、および 236 番目のスクリプトの一部が含まれています。しかし、#236 については、スクリプトが失敗する原因となる異常は何もありません (いずれにしてもわかります)。また、ブロックprint
内の単純なステートメントを引用してスタック トレースが発生する理由も理解できません。except
try-except
(2) さらなるトラブルシューティングの実験として、テーブルのブロック全体をコメントアウトしてスクリプトを実行してみました。それでも SP スクリプトの生成に失敗し、行 33 を引用して同じスタック トレースを生成します。違いは、今回は終了する前に手順 #236 のスクリプトの別の 16 行を正常に生成することです。ただし、出力ファイルの全体的なファイル サイズは大幅に小さくなります。ファイルが同じサイズで停止したのか、スクリプトが SP の同じポイントで停止したのかはわかりましたが、どちらも当てはまりません。
したがって、この時点で、SP の問題文字またはスクリプト プロセスのファイル/メモリ サイズの制限を (明らかに) 除外したので、困惑しています。