Лучший способ вставить значения несколько раз из слоя данных в хранимую процедуру? - PullRequest
0 голосов
/ 16 февраля 2011

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

Например: -

CREATE PROCEDURE [dbo].[DataInsert]
    @DataName nvarchar(64)
AS
BEGIN
    INSERT INTO 
         table01 (dataname) 
        VALUES 
    (@dataname)
END

Теперь, когда изменилось требование, для каждого запроса клиента у меня естьдобавить значения 5 раз.Так что же такое лучшая практика?

Вызываю ли я эту хранимую процедуру 5 раз из моего DAL?

или

Передаем все значения (возможно, через запятую) в хранимую процедуру за один раз, а затем позволяемхранимую процедуру добавить в 5 раз?

Кстати.Это не всегда 5 раз.Это переменчиво.

Ответы [ 4 ]

1 голос
/ 17 февраля 2011

Вы можете создать пользовательский тип таблицы;

CREATE TYPE [dbo].[SomeInfo] AS TABLE(
[Id] [int] NOT NULL, 
[SomeValue] [int] NOT NULL )

Определить сохраненный процесс как таковой;

CREATE PROCEDURE [dbo].[AddSomeStuff]
    @theStuff [SomeInfo] READONLY
AS
BEGIN
    INSERT INTO SOMETABLE ([...columns...])
    SELECT [...columns...] from @theStuff
END

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

var cmd = new SqlCommand("AddSomeStuff", sqlConn) {CommandType = CommandType.StoredProcedure};

var param = new SqlParameter("@theStuff", SqlDbType.Structured) {Value = table};
cmd.Parameters.Add(param);

cmd.ExecuteNonQuery();
0 голосов
/ 17 февраля 2011

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

Если производительность или поведение транзакций является проблемой, вы можете рассмотреть возможность отправкиКоманды в одной партии.

Вы говорили о 5 вставках.Если количество записей для вставки намного больше, вы также можете рассмотреть возможность массовой вставки.

0 голосов
/ 17 февраля 2011

Я бы либо вызывал ваш proc несколько раз (это был бы мой выбор), либо вы могли бы использовать XML для передачи списка значений в качестве одного параметра.

http://support.microsoft.com/kb/555266

0 голосов
/ 17 февраля 2011

Кстати, этот процесс работает - я только что написал и протестировал его, смотрите результаты ниже!

CREATE PROCEDURE [dbo].[DataInsert]
     @DataName nvarchar(max) AS  
BEGIN  
DECLARE @pos SMALLINT, @str VARCHAR(max)  

WHILE @DataName <> ''  
BEGIN  
    SET @pos = CHARINDEX(',', @DataName)  
    IF @pos>0  
        BEGIN  
            SET @str = LEFT(@DataName, @pos-1) 
            SET @DataName = RIGHT(@DataName, LEN(@DataName)-@pos)  
        END  
    ELSE  
        BEGIN  
            SET @str = @DataName 
            SET @DataName = ''  
        END  

   INSERT INTO table01 VALUES(CONVERT(VARCHAR(100),@str)) 

END  
END  
GO

и запустите его: -

EXEC @return_value =[dbo]. [DataInsert] @DataName = N 'пять, биты, ваших, данных'

* строк из таблицы01: *

пять

бит

из

ваши

данные

(затронуто 5 строк)

...