Metoda executemany(sql, seq_of_parameters) wykonuje wielokrotnie tę samą instrukcję SQL dla zestawu parametrów. Dlatego drugi argument, seq_of_parameters , musi być sekwencją krotek parametrów, a nie tylko pojedynczą krotką parametrów:
cursor.executemany("update sampledata SET POS = ? where SRNO = ?", [(x[a], a)])
Jeśli przekażesz tylko jedną krotkę, kursor przyjmie, że pierwszy element, x[a] , jest krotką parametrów. Myślę, że jest to ciąg 50 znaków i jest interpretowany jako sekwencja 50 parametrów, podczas gdy ciąg SQL oczekuje tylko 2.
Co więcej, zauważ, że użyłem ? jako symbol zastępczy zamiast %s , ponieważ ten ostatni wydaje się nie być obsługiwany przez PyODBC, ponieważ poinformował, że oczekuje 0 parametrów.
W twoim przypadku możesz użyć execute() w pętli, ponieważ chcesz uruchomić instrukcję tylko raz na iterację:
cursor.execute("update sampledata SET POS = ? where SRNO = ?", (x[a], a))