Converti la stringa in uniqueidentifier in VBScript
-
19-08-2019 - |
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.
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
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 ...