Domanda

Ho uno script che esegue una procedura memorizzata nel mio database del server SQL, il problema è che la procedura memorizzata accetta un parametro uniqueidentifier. Ho una funzione che prende un ID di sessione dal database (che è un nvarchar), quindi VBScript lo rende una stringa e devo convertirlo per passarlo alla procedura memorizzata.


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 

Ottengo " Valore del carattere non valido per la specifica del cast " quando provo ad eseguire la procedura memorizzata.


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

Non posso cambiare nulla nel database, quindi ho bisogno di un modo per superare questo nel mio script.

È stato utile?

Soluzione

A seconda del tipo di dati di SELECT OpenSession, potresti essere in grado di lanciarlo / convertirlo nella query e VBScript potrebbe conservare il tipo di dati come GUID:

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

Quando usi GetOpenSession o rs.Fields (0) .Value , si spera che VBScript lo conserverà come GUID.

L'altra possibilità sembra essere un'API Win32 che utilizza < codice> CoCreateGuid e StringFromGUID2 . Un esempio è disponibile qui , ma richiede funzioni Win32 esterne e un tipo per GUID.

Altri suggerimenti

Credo che VBScript si aspetti che i GUID vengano chiusi. L'ID sessione è dello stesso formato del seguente {D6CA6263-E8E1-41C1-AEA6-040EA89BF030}

Di solito cambio il tipo di parametro della procedura memorizzata in varchar (38).

SQL Server rende un lavoro migliore costringendo la stringa a un GUID quando necessario.

Qual è il valore di GetOpenSession dopo averlo assegnato? Quale tipo di dati? Sembra che non sia compatibile con il tipo 72 (GUID), che stai dichiarando nella chiamata CreateParameter.

Potresti dimenticare di usare del tutto i comandi ADO ed eseguire semplicemente la procedura memorizzata usando il semplice SQL.

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

Ovviamente è terribile costruire comandi SQL in questo modo, ma è solo per un test, dopo tutto ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top