2009-01-21 61 views
2

我有一个脚本在我的SQL Server数据库中运行存储过程,问题是存储过程需要一个uniqueidentifier参数。我有一个从数据库中获取会话ID的函数(它是一个nvarchar),所以VBScript使它成为一个字符串,我需要将其转换为将它传递给存储过程。将字符串转换为VBScript中的uniqueidentifier


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 

我无法更改数据库中的任何内容,所以我需要一种方法在脚本中解决这个问题。

+0

你怎么知道,“选择顶层1的openSession FROM OpenSessions与(NOLOCK)”将给你活跃的会议?无论代表哪个会话,您只需选择第一个OpenSession值。 – 2009-01-21 20:37:15

+0

存储在此表中的唯一会话是活动会话,因此使用哪一个并不重要。 – Tester101 2009-01-21 20:42:47

+0

嗯......好吧,但是如果你不关心你传递给proc的活动会话ID,它听起来像是一个奇怪的架构。 – 2009-01-21 20:49:10

回答

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函数和一个Type for GUID。

0

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

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

+1

我不控制数据库,也不能改变任何东西。我只是一名测试人员,开发人员不喜欢为了帮助我们而改变事物。 – Tester101 2009-01-21 20:53:59

0

GetOpenSession在赋值后的价值是什么?哪种数据类型?这听起来好像与您在CreateParameter调用中声明的类型72(GUID)不兼容。

+0

这是一个字符串。但是,如果我尝试创建类型为8(字符串)的参数,我会得到“错误转换数据类型nchar为uniqueidentifier。” – Tester101 2009-01-21 20:58:09

2

我相信VBScript期望GUID被大括号终止。 是同一种格式作为您的会话ID以下{D6CA6263-E8E1-41C1-AEA6-040EA89BF030}

0

您可能会忘记使用ADO命令,只需使用普通SQL执行存储过程即可。

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

显然,这是可怕的建立这样的SQL命令,但它只是一个测试,毕竟......

相关问题