#sql-server #go
#sql-сервер #Вперед
Вопрос:
Я пытаюсь вставить несколько записей в sql server с помощью Go. Я использую приведенный ниже код. но получаю эту ошибку «mssql: неправильный синтаксис рядом с ‘?’.» .
func BulkInsert(unsavedRows []*ExampleRowStruct) error {
valueStrings := make([]string, 0, len(unsavedRows))
valueArgs := make([]interface{}, 0, len(unsavedRows) * 3)
for _, post := range unsavedRows {
valueStrings = append(valueStrings, "(?, ?, ?)")
valueArgs = append(valueArgs, post.Column1)
valueArgs = append(valueArgs, post.Column2)
valueArgs = append(valueArgs, post.Column3)
}
stmt := fmt.Sprintf("INSERT INTO my_sample_table (column1, column2, column3) VALUES %s",
strings.Join(valueStrings, ","))
_, err := db.Exec(stmt, valueArgs...)
return err
}
Комментарии:
1. MySQL использует
?
параметры for. MSSQL использует@name
. См github.com/denisenkom/go-mssqldb#parameters для примера в Go.2. Спасибо за быстрый ответ. я обновляю это до параметров, и теперь там написано mssql: необходимо объявить скалярную переменную «@name». извините, если это основные вопросы, я новичок в go и обучении
Ответ №1:
Я не знаю GO, но, глядя на ваше stmt
значение, я думаю, что ваш формат запроса может быть неправильным.
Если вы считаете, что вы должны вводить непосредственно в качестве запроса SQL Server, это будет что-то вроде:
INSERT INTO my_sample_table (column1, column2, column3) VALUES ('val1', 'val2', 'val3')
(предполагается, что все столбцы являются переменными)
Это также можно сделать с помощью переменных:
DECLARE @val1 varchar(4) = 'val1', @val2 varchar(4) = 'val2', @val3 varchar(4) = 'val3'
INSERT INTO my_sample_table (column1, column2, column3) VALUES (@val1, @val2, @val3)
Из @adrian link, примером в вашем случае может быть:
db.QueryContext(ctx, `INSERT INTO my_sample_table (column1, column2, column3) VALUES (@p1, @p2, @p3);`, "val1", "val2", "val3")
Исходя из этого, попробуйте следующее:
stmt := fmt.Sprintf("INSERT INTO my_sample_table (column1, column2, column3) VALUES (@p1, @p2, @p3)", strings.Join(valueStrings, ","))