English 中文(简体)
在VBScript中将字符串转换为唯一标识符
原标题:
  • 时间:2009-01-21 20:31:34
  •  标签:

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

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

最佳回答

根据SELECT OpenSession的数据类型,您可能可以在查询和VBScript中进行强制转换,并且数据类型可能会保持为GUID。

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

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

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

问题回答

I believe VBScript expects GUIDs to be brace terminated. Is your Session id of the same format as the following {D6CA6263-E8E1-41C1-AEA6-040EA89BF030}

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

SQL Server 在需要时将字符串转换为 GUID 的工作做得更好。

你给GetOpenSession赋值后,它的值是多少?它的数据类型是什么?听起来它似乎与你在CreateParameter调用中声明的类型72(GUID)不兼容。

你完全可以放弃使用 ADO 命令,而是使用纯 SQL 执行存储过程。

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

显而易见地,像这样构建SQL命令是可怕的,但毕竟只是为了测试。





相关问题
热门标签