2015-05-05 1 views
0

В приведенном ниже сценарии в основном используется таблица источников и таблица целей и копируются все записи. Он работает достаточно хорошо, но одна повторяющаяся проблема, с которой я сталкиваюсь, состоит в том, что она, кажется, усекает некоторые строки. Вот один из выходов ошибок:Почему мой скрипт, похоже, случайным образом усекает строки?

Номер ошибки: -2147217900 Описание: [Microsoft] [ODBC SQL Server Driver ] [SQL S ервере] Unclosed кавычки после строки символов «STRINGSEGMENT^урна: UUID : e9 e91fe151-5w4c-12e1-bac5-25b3a0 '.

INSERT INTO TableName VALUES ('23189', '23189', '', '', '1 ^^', '', '12/5/2013 3: 37: 2 2 PM', 'fieldvalue ',' ',' somethinghere ',' somethinghere ',' 12/5/2013 9:37:22 AM ',' 123456 ',' 1234568798 ',' STRINGSEGMENT^urn: uuid: e91fe151-5w4c-12e1- bac5-25b3a0

запросов является 584 символов

Если посмотреть на исходные данные, строка, которая усекается выглядит примерно так:

STRINGSEGMENT^урна: UUID: e91fe151-5w4c-12e1-bac5-25b3a 004b00^STRINGSEGMENT

Так что это отрезая его после 53-го символа (выделено). Вся длина tSQL составляет всего 584 символов.

Почему это происходит?

WScript.Echo "Setting Vars..." 
Dim sConnect, tConnect, resultSet, r 
Dim sDSN, sUserName, sPassWord 
Dim tDSN, tUserName, tPassWord 
Dim value 

sDSN  = "mydsn" 
sUsername = "myusername" 
sPassword = "mypassword" 
tDSN  = "LOCAL" 
tUsername = "myusername" 
tPassword = "mypassword" 
sTable = "sourceTable" 
tTable = "targetTable" 

sSQL  = "" 'see below 
sDSN  = "DSN=" & sDSN & ";UID=" & sUsername & ";PWD=" & sPassword & ";" 
tSQL  = "Select TOP 1 ID FROM " & tTable & " ORDER BY ID Desc" 
tDSN  = "DSN=" & tDSN & ";UID=" & sUsername & ";PWD=" & sPassword & ";" 



Set sConnect = CreateObject("ADODB.Connection") 
WScript.Echo "Opening connection to source..." 
sConnect.Open sDSN 

Set tConnect = CreateObject("ADODB.Connection") 
WScript.Echo "Opening connection to target..." 
tConnect.Open tDSN 

WScript.Echo "Finding Current Record..." 
Set r = tConnect.Execute(tSQL) 
On Error Resume Next 
r.MoveFirst 
if r.eof Then currentRecord = 1 
Err.Clear 

Do While Not r.eof 
    currentRecord = r("ID") + 1 
    r.MoveNext 
Loop 
r.Close 

sSQL ="Select * FROM " & sTable & " WHERE ID >= " & currentRecord 

WScript.Echo "Beginning shadow at record " & currentRecord & "..." 
Set resultSet = sConnect.Execute(sSQL) 

resultSet.MoveFirst 
Do While Not resultSet.eof 
    On Error Resume Next 
    tSQL = "INSERT INTO " & tTable & " VALUES ('" 
    For i = 0 To resultSet.fields.Count - 1 
    if NOT IsNull(resultSet(i)) Then 
     value = replace(resultSet(i),"'","") 
     'somewhere around here 
    else 
     value = "" 
    End If 
    tSQL = tSQL & value 
    if i < resultSet.fields.Count - 1 Then 
     tSQL = tSQL & "','" 
    end if 
    Next 
    tSQL = tSQL & "')" 
    'when the error occurs, the line above doesn't seem to be processed but the line below obviously is... 
    tConnect.Execute(tSQL) 
    If (Err.Number <> 0) Then 
    WScript.Echo "Error Number: " & Err.Number & " Description: " & Err.Description 
    WScript.Echo tSQL 
    WScript.Echo "Query is " & Len(tSQL) & " characters long" 
    WScript.StdIn.ReadLine 
    Err.Clear 
    End If 
    tSQL = "" 
    resultSet.MoveNext 
Loop 

resultSet.Close 
sConnect.Close 
Set sConnect = Nothing 

tConnect.Close 
Set tConnect = Nothing 
WScript.Quit(0) 
+0

Это '00' в' ...- 25b3a0' ** 00 ** '4b00^STRINGSEGMENT'. Я думаю, что байт с значением '0x00' считается строковым терминатором ... (я не знаю значение« STRINGSEGMENT »и откуда оно) ... – JosefZ

+0

Любые идеи о том, как этого избежать? –

+0

Также STRINGSEGMENT - это текст, который я использовал для замены фактического текста, который является приватным. :) Я не думаю, что это имеет отношение к этой проблеме. –

ответ

0

Я не знаю, почему это происходит, но вот мое обходное решение. Я не буду принимать это как ответ, просто хотел бы задокументировать.

Function allowed(n) 
    allowed = true 
    if n = 13 Then allowed = false 
    if n = 14 Then allowed = false 
End Function 


Function sanitize(v,i) 'v=value i=index 
    mystr = "" 
    if allowed(i) Then 
     if Not IsNull(v) Then 
      mystr = replace(v,"'","") 
     End If 
    end if 
    sanitize = mystr 
End Function 

В принципе, я просто вручную исключаю столбцы, у которых есть проблема. Обратите внимание, что я идентифицировал второй. Что действительно любопытно, так это то, что столбцы 12 и 13 имеют тождественные данные в исходной базе данных, но столбец 12 экземпляров отлично.