Динамические параметры в хранимой процедуре? - PullRequest
0 голосов
/ 19 января 2011

Мне нужно обновить таблицу со значениями из списка. Я пытаюсь создать столько параметров, сколько элементов в списке, мой код приведен ниже, но как я могу назвать их по-разному? чтобы они не перезаписывали друг друга?

 For Each item As ListItem In ris
        Dim pID As New SqlParameter("@userid", SqlDbType.Int)
        pID.Value = objFormat.CheckSQL(item.Value)
        myCommand.Parameters.Add(pID)
    Next

а на стороне SQL можно ли написать оператор обновления, который будет принимать динамическое число параметров?

так, например, мне нужно обновить несколько пользователей с одним и тем же значением в поле "active" ...

Ответы [ 3 ]

1 голос
/ 19 января 2011

Вот один из них, в общем случае передаем «список» в виде единственного строкового параметра, разделенного запятыми (или чем-то еще), и анализируем его в sproc.

http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm

есть также это

Поскольку параметр массива Sqlserver отсутствует, каков наилучший способ продолжить?

0 голосов
/ 23 января 2011

re: "спасибо, разве это плохо для циклического перебора элементов списка и многократного вызова хранимой процедуры? Вместо того, чтобы делать все это в одной хранимой процедуре? - xrum 19 января в 16:55"

Если вы подумаете об этом, вы будете где-то выполнять итерации - почему бы не загрузить все ваши значения в список и выполнить обновления, как вы описываете?Если бы это был я, я бы просто удостоверился, что открывал Соединение только один раз:

    Dim CommandText As String = _
    "UPDATE MyTYable SET SomeField = @SomeField " & _
    "WHERE UserID = @UserID"

    Using cn As New SqlClient.SqlConnection(MyConnectionString)
        Using cmd As New SqlClient.SqlCommand(cn, CommandText)

            'The Record key in the database:
            cmd.Parameters.AddWithValue("@UserID", -1)

            'Whatever it is you plan to UPDATE:
            cmd.Parameters.Add("@SomeField", "")

            cn.Open()

            For Each Item As ListItem In ris
                cmd.Parameters("@UserID").Value = Item.Value
                cmd.Parameters("SomeField").Value = SomeValueFromSomeWhere
                cmd.ExecuteNonQuery()
            Next

        End Using
    End Using

Очевидно, это нужно будет немного настроить для вашего конкретного использования.Я не уверен, что вы делаете со своим собранным списком идентификаторов пользователей, но приведенный выше скелет кода представляет собой относительно эффективный способ выполнения серии INSERTS или UPDATES без дополнительных затрат на открытие и закрытие всего соединения.

Если количество обновлений, которое вам нужно выполнить, действительно обременительно, один из методов конкатенации строк, упомянутых выше, может быть более эффективным, и / или быстрая вставка всех значений, подлежащих ОБНОВЛЕНИЮ, в таблицу Tempобратная сторона Db, за которой следует инструкция SELECT INTO, которая обрабатывает большую часть INSERT на сервере.

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