2010-09-14 3 views
2

Я надеюсь использовать следующий метод обновления \ вставки, чтобы ускорить мое приложение вставки \ обновления:Если Exists Update Else Вкладыш с VB.net (SQL параметризацию запросов)

UPDATE [Application_Type_Table] 
SET ApplicationType='Test Value' 
WHERE ID='1' 
IF @@ROWCOUNT=0 
INSERT INTO [Application_Type_Table] VALUES ('Test Value') 

Как бы я это сделать с параметрами sql? функция rowcount будет выбрана в качестве параметра из-за @@.

sqlCommand.CommandText = _ 
"UPDATE [Application_Type_Table]" _ 
SET (SET [email protected]" _ 
"WHERE [email protected] IF @@ROWCOUNT=0 INSERT INTO [Application_Type_Table] VALUES (@TestValue)" 

http://blogs.msdn.com/b/miah/archive/2008/02/17/sql-if-exists-update-else-insert.aspx

+1

Уверены, что это проблема? Я видел, что 'sqlCommand.CommandText =" SELECT @@ IDENTITY "' используется несколько раз, а @ -значения не представляют проблемы. – Heinzi

+0

Какая ошибка вы получаете? –

ответ

4

Эта модель известна как UPSERT. Современный способ сделать это - использовать MERGE в SQL Server 2008, например.

MERGE INTO Application_Type_Table AS target 
USING (
     VALUES (@RecordID, @TestValue) 
    ) AS source (ID, ApplicationType) 
    ON target.ID = source.ID 
WHEN MATCHED 
    THEN UPDATE 
      SET ApplicationType = source.ApplicationType 
WHEN NOT MATCHED 
    THEN INSERT (ID, ApplicationType) 
      VALUES (ID, ApplicationType); 
+0

Каким образом это исполнение мудрости против вышеупомянутого метода? – madlan

+1

@madlan: Теоретически MERGE может быть лучше оптимизирован, потому что ему нужно выполнить только один проход. Как и в случае с производительностью, это зависит от многих факторов. См .: Оптимизация производительности отчета MERGE (http://technet.microsoft.com/en-us/library/cc879317.aspx). – onedaywhen

-1

Я хотел бы предложить переместить запрос к хранимой процедуре. Запросы (особенно многозадачные) на самом деле не являются жестко закодированными в приложении IMO. Это также будет иметь бонус облегчения вашей проблемы;)

+0

Я бы возражал против. SP отлично подходят для базового материала CRUD; но не более сложные подпрограммы с несколькими операторами. Десять лет назад было общепринято предусмотреть приложение как «базу данных с некоторым бизнес-кодом». Но сегодня наше определение программного приложения отличается. Бизнес-слои находятся за пределами базы данных. Что касается производительности, СУБД повторно использует план выполнения для любого оператора SQL, а не только хранимые процедуры, поэтому производительность эквивалентна после компиляции. –

0
sqlCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM [Application_Type_Table] WHERE "_ 
"ID='1') BEGIN INSERT INTO " _ 
"[Application_Type_Table] VALUES ('Test Value') END ELSE BEGIN UPDATE [Application_Type_Table]"_ 
"SET ApplicationType='Test Value'"_ 
"WHERE ID='1' END" 
Смежные вопросы