Преобразовать строку в уникальный идентификатор в VBScript - PullRequest
2 голосов
/ 21 января 2009

У меня есть скрипт, который запускает хранимую процедуру в моей базе данных SQL-сервера, проблема в том, что хранимая процедура принимает параметр uniqueidentifier. У меня есть функция, которая получает идентификатор сеанса из базы данных (которая является 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 ]

3 голосов
/ 22 января 2009

Я полагаю, что VBScript ожидает, что GUID будет завершен скобками. Ваш идентификатор сеанса имеет тот же формат, что и следующий {D6CA6263-E8E1-41C1-AEA6-040EA89BF030}

1 голос
/ 22 января 2009

В зависимости от типа данных SELECT OpenSession вы можете преобразовать / преобразовать его в запросе, а VBScript может сохранить тип данных в качестве GUID:

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

Когда вы используете GetOpenSession или rs.Fields(0).Value, мы надеемся, что VBScript сохранит его как GUID.

Другая возможность - это Win32 API, использующий CoCreateGuid и StringFromGUID2. Пример можно найти здесь , но для этого требуются внешние функции Win32 и тип для GUID.

0 голосов
/ 22 января 2009

Вы можете вообще забыть об использовании команд ADO и просто выполнить хранимую процедуру, используя простой SQL.

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

Очевидно, что создавать команды SQL подобным образом ужасно, но в конце концов это просто для проверки ...

0 голосов
/ 21 января 2009

Какое значение GetOpenSession после того, как вы его присвоили? Какой тип данных? Похоже, что он не совместим с типом 72 (GUID), который вы указали в вызове CreateParameter.

0 голосов
/ 21 января 2009

Обычно я меняю тип параметра хранимой процедуры на varchar (38).

SQL Server лучше работает при принудительном приведении строки к GUID, когда это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...