Question

J'ai un script qui exécute une procédure stockée dans ma base de données SQL Server. Le problème est que la procédure stockée prend un paramètre uniqueidentifier. J'ai une fonction qui récupère un identifiant de session de la base de données (qui est un nvarchar), donc VBScript en fait une chaîne et j'ai besoin de la convertir pour la transmettre à la procédure stockée.


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 

J'obtiens " Valeur de caractère non valide pour la spécification de distribution " lorsque j'essaie d'exécuter la procédure stockée.


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

Je ne peux rien modifier dans la base de données. J'ai donc besoin d'un moyen de remédier à cela dans mon script.

Était-ce utile?

La solution

En fonction du type de données de SELECT OpenSession, vous pouvez éventuellement le convertir / convertir en requête et VBScript peut éventuellement conserver le type de données en tant que GUID:

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

Lorsque vous utilisez GetOpenSession ou rs.Fields (0) .Value , nous espérons que VBScript le conservera sous forme de GUID.

L’autre possibilité semble être une API Win32 utilisant < code> CoCreateGuid et StringFromGUID2 . Un exemple est ici , mais il nécessite des fonctions Win32 externes et un type pour le GUID.

Autres conseils

Je pense que VBScript s'attend à ce que les GUID soient mis fin à l'accolade. Votre identifiant de session a-t-il le même format que celui-ci {D6CA6263-E8E1-41C1-AEA6-040EA89BF030}

Je remplace généralement le type de paramètre de la procédure stockée par varchar (38).

SQL Server réussit mieux à contraindre la chaîne à un GUID en cas de besoin.

Quelle est la valeur de GetOpenSession après son attribution? Quel type de données? Il semble que ce ne soit pas compatible avec le type 72 (GUID) que vous indiquez dans l’appel CreateParameter.

Vous pourriez oublier d'utiliser les commandes ADO et simplement exécuter la procédure stockée à l'aide de SQL simple.

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

Évidemment, c'est terrible de construire des commandes SQL comme celle-ci, mais c'est juste pour un test, après tout ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top