我有一个脚本在我的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
我无法更改数据库中的任何内容,因此我需要一种方法来在我的脚本中克服这一点。
答案 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)
当您使用GetOpenSession
或rs.Fields(0).Value
时,希望VBScript将其保留为GUID。
另一种可能性似乎是使用CoCreateGuid
和StringFromGUID2
的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命令很糟糕,但毕竟只是为了测试......