2009-01-21 22 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命令,但它只是一個測試,畢竟......

相關問題