2013-11-29 4 views
1

Я создал тип в SQL Server 2008 для передачи данных в хранимую процедуру. Мой SP работает нормально, но как я могу проверять данные, если они существуют в таблице?
(например: проверить Detailid или идентификатор , если существует: обновить их , если не существует: вставить новый)

вот мой SP:как проверить данные, если существует «тип таблицы» в хранимой процедуре

ALTER PROCEDURE [dbo].[Insert_Data] 
(
    @empinfo myType READONLY 
) 
AS 
BEGIN 
SET NOCOUNT ON; 

Insert into TableEmp(ID, DetailID, Text) 
select id, detailid, text from @empinfo 

END 

Thnx все

ответ

2
ALTER PROCEDURE [dbo].[Insert_Data] 
(
    @empinfo myType READONLY 
) 
AS 
BEGIN 
SET NOCOUNT ON; 


MERGE TableEmp AS t 
USING (select id, detailid, [text] from @empinfo) AS s 
ON s.ID = t.ID 
WHEN MATCHED THEN 
    UPDATE SET t.detailid = s.detailid, 
       t.[text] = s.[text] 

WHEN NOT MATCHED THEN 
INSERT(id, detailid, [text]) 
VALUES(s.id, s.detailid, s.[text]); 

END 
+0

Есть ли проблема при обновлении? причина вставки в порядке, но обновления нет. Thnx –

+0

Зачем в чем проблема? –

+1

+1 Но использование 'MERGE' не позволяет избежать состояния гонки. Нам нужно добавить 'HOLDLOCK', чтобы избежать этой проблемы. Пожалуйста, прочитайте это [статья, написанная Дэном Гузманом] (http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx) –

1

Вы можете объявить переменную и подсчитать записи в таблице.

DECLARE @count INT 

SET @count = (SELECT COUNT(ID) 
       FROM TableEmp) 

-- Do Something with the results 

Итак, используя условную логику, вы можете сделать что-то со счетом для достижения разных результатов.

IF @count = 0 
BEGIN 
    -- Do Something cool like insert data 
END 
ELSE 
BEGIN 
    -- Do Something else like update data 
END 

Это простой пример, где вы можете найти конкретную запись и обновить ее. Если вам нужно обновить многие записи, вы можете использовать курсоры и перебирать нужные записи и обновлять то, что вам нужно.

Более подробная информации о курсорах можно найти здесь:

http://technet.microsoft.com/en-us/library/ms180169.aspx

+0

я должен обновить также много записей. И люди говорят «использовать курсор меньше». И я также не знаю о курсоре. Thnx –

Смежные вопросы