在VBScript中将字符串转换为uniqueidentifier

时间:2009-01-21 20:31:35

标签: sql-server vbscript uniqueidentifier

我有一个脚本在我的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

我无法更改数据库中的任何内容,因此我需要一种方法来在我的脚本中克服这一点。

5 个答案:

答案 0 :(得分:3)

我相信VBScript期望GUID被终止。 您的会话ID是否与以下格式相同{D6CA6263-E8E1-41C1-AEA6-040EA89BF030}

答案 1 :(得分:1)

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

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

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

另一种可能性似乎是使用CoCreateGuidStringFromGUID2的Win32 API。找到一个示例here,但它需要外部Win32函数和一个GUID类型。

答案 2 :(得分:0)

我通常将存储过程的参数类型更改为varchar(38)。

SQL Server在需要时更好地将字符串强制转换为GUID。

答案 3 :(得分:0)

分配后,GetOpenSession的价值是多少?哪种数据类型?听起来它与您在CreateParameter调用中声明的类型72(GUID)不兼容。

答案 4 :(得分:0)

您可以完全忘记使用ADO命令,只使用纯SQL执行存储过程。

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

显然构建这样的SQL命令很糟糕,但毕竟只是为了测试......