массовая вставка в sql server с использованием базы данных пакетов / пакета sql

#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, ","))