2

我有一个在我的 SQL 服务器数据库中运行存储过程的脚本,问题是存储过程需要一个 uniqueidentifier 参数。我有一个从数据库中获取会话 id 的函数(它是一个 nvarchar),因此 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 被大括号终止。您的会话 ID 是否与以下格式相同 {D6CA6263-E8E1-41C1-AEA6-040EA89BF030}

于 2009-01-21T21:31:40.400 回答
1

根据 SELECT OpenSession 的数据类型,您可以在查询中强制转换/转换它,并且 VBScript 可能会将数据类型保留为 GUID:

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

当您使用GetOpenSessionorrs.Fields(0).Value时,希望 VBScript 将其保留为 GUID。

另一种可能性似乎是 Win32 API 使用CoCreateGuidand StringFromGUID2此处有一个示例,但它需要外部 Win32 函数和 GUID 类型。

于 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 回答