2

SQLサーバーデータベースでストアドプロシージャを実行するスクリプトがあります。問題は、ストアドプロシージャがuniqueidentifierパラメーターを受け取ることです。データベース(nvarchar)からセッションIDを取得する関数があるので、VBScriptはそれを文字列にし、ストアドプロシージャに渡すために変換する必要があります。


Function GetOpenSession
    Set conn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    conn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Data Source=" & Source
    rs.CursorLocation = 3
    rs.Open "SELECT top 1 OpenSession FROM OpenSessions with (nolock)" , conn, 3, 3
    If rs.RecordCount = 0 Then
        MsgBox "No Connection"
    Else
        GetOpenSession = rs.Fields(0).Value
    End If
End Function 

ストアドプロシージャを実行しようとすると、「キャスト指定の文字値が無効です」というメッセージが表示されます。


    set cnParam = cmd.CreateParameter("@ActiveSession",72,1,,GetOpenSession)
    cmd.Parameters.Append cnParam

データベース内の何も変更できないので、スクリプトでこれを克服する方法が必要です。

4

5 に答える 5

3

VBScript は、GUID が中かっこで終わることを期待していると思います。次の {D6CA6263-E8E1-41C1-AEA6-040EA89BF030} と同じ形式のセッション ID ですか。

于 2009-01-21T21:31:40.400 に答える
1

SELECT OpenSession のデータ型によっては、クエリでキャスト/変換できる場合があり、VBScript はデータ型を GUID として保持する可能性があります。

SELECT top 1 CONVERT(uniqueidentifier, OpenSession)
FROM OpenSessions with (nolock)

GetOpenSessionまたはを使用する場合rs.Fields(0).Value、VBScript がそれを GUID として保持することを願っています。

もう 1 つの可能性は、 と を使用する Win32 API のようCoCreateGuidですStringFromGUID2。例はここにありますが、外部の Win32 関数と GUID の Type が必要です。

于 2009-01-21T21:32:51.427 に答える
0

通常、ストアド プロシージャのパラメーターの型を varchar(38) に変更します。

SQL Server では、必要に応じて文字列を強制的に GUID にするというより適切な処理が行われます。

于 2009-01-21T20:48:15.277 に答える
0

割り当てた後の GetOpenSession の値は何ですか? どのデータ型?CreateParameter呼び出しで述べているタイプ72(GUID)と互換性がないようです。

于 2009-01-21T20:51:25.053 に答える
0

ADO コマンドの使用を完全に忘れて、単純な SQL を使用してストアド プロシージャを実行することができます。

Set rs = CreateObject("ADODB.Recordset")
rs.Open "EXEC usp_MySP '" & GetOpenSession & "'", cnn

明らかに、このような SQL コマンドを作成するのはひどいことですが、結局のところ、それは単なるテストのためのものです...

于 2009-01-21T21:37:21.560 に答える