2016-08-19 13 views
1

Будучи новичком, у меня возник вопрос, который помогает мне устранить то, над чем я работаю.Обновление нескольких записей с использованием хранимой процедуры

С помощью таблицы, созданной ниже, есть способ изменить хранимую процедуру для обновления нескольких строк в таблице

CREATE TABLE AccountTable 
(
    RowID int IDENTITY(1, 1), 
    AccountID varchar(2), 
    AccountName varchar(50), 
    SeqNum int, 
    SeqDate datetime 
) 

CREATE PROCEDURE [ACCOUNTTABLE_UPDATE] 
(
    @SeqNum int, 
    @SeqDate datetime, 
    @Account_ID varchar(2) 
) 

AS 
SET NOCOUNT ON 
BEGIN 
UPDATE AccountTable 
SET SeqNum = @SeqNum, SeqDate = @SeqDate 
WHERE AccountID = @AccountID 
END 

EXEC ACCOUNTTABLE_UPDATE SeqNumValue, SeqDateValue, AccountIDValue 

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

+2

вы можете использовать таблицу оцененный параметр или параметр XML или запятыми строку передать несколько значений и использовать его. проверьте это: https://sqlwithmanoj.com/2015/07/10/passing-multiple-values-with-a-single-parameter-in-a-stored-procedure-sql-server/ –

+1

http: // stackoverflow. com/questions/5595353/how-to-pass-table-value-parameters-to-stored-procedure-from-net-code –

ответ

4

Вы можете использовать табличные параметры (here некоторой информация)

В первом создать тип таблицы и SP:

USE MyDB; 
GO 

-- Create a table type. 
CREATE TYPE SomeTableType AS TABLE ( 
    SeqNum int, 
    SeqDate datetime, 
    Account_ID varchar(2) 
); 
GO 

-- Create a procedure to receive data for the table-valued parameter. 
CREATE PROCEDURE [ACCOUNTTABLE_UPDATE] 
    @T SomeTableType READONLY 
AS 
SET NOCOUNT ON 

UPDATE AT 
SET SeqNum = t.SeqNum, SeqDate = t.SeqDate 
FROM AccountTable AT 
INNER JOIN @T t 
    ON t.AccountID = AT.AccountID 
GO 

Затем декларировать таблицу с типом таблицы, созданной ранее, добавить данные и запустить ваш SP:

-- Declare a variable that references the type. 
DECLARE @Temp AS SomeTableType; 

-- Add data to the table variable 
INSERT INTO @Temp VALUES 
... 

-- Pass the table variable data to a stored procedure. 
EXEC [ACCOUNTTABLE_UPDATE] @Temp; 
GO 

Другой способ передать параметры в XML:

USE MyDB; 
GO 

CREATE PROCEDURE [ACCOUNTTABLE_UPDATE] 
    @x xml 
AS 
SET NOCOUNT ON 

UPDATE AT 
SET SeqNum = t.v.value('@SeqNum','int'), 
    SeqDate = t.v.value('@SeqDate','datetime') 
FROM AccountTable AT 
INNER JOIN @x.nodes('/row') as t(v) 
    ON t.AccountID = t.v.value('@AccountID','varchar(2)') 

Затем выполнить его:

DECLARE @x xml = N'<row SeqNum="1" SeqDate="2016-08-01 12:43:08.000" AccountID="AA"/>' 

EXEC [ACCOUNTTABLE_UPDATE] @x; 
+0

Спасибо, просто понять. – walangala

+0

Мое удовольствие! Я добавил еще одно решение с xml, оно также может быть полезно. – gofr1

+0

Просто обновление, худшая часть, я использую SQL Server 2000 (я знаю) Я только понял, что он не работает с этой версией. Хотя, все равно спасибо за вашу помощь. – walangala