Какая версия SQL Server? Эта информация всегда полезна, поэтому, пожалуйста, пометьте свой вопрос конкретной версией.
Если sql-server-2008 или выше, вы можете рассмотреть MERGE
вместо отдельных операций INSERT
/ UPDATE
, хотя с момента написания этого ответа я определенно изменил мою мелодию и предпочел методологию UPDATE / IF @@ROWCOUNT = 0 / INSERT
, которую вы предложили. Для получения дополнительной информации см. Эту статью, которую я написал:
Вот пример MERGE
(запустите его в базе данных tempdb), но я снова рекомендую против него вообще.
CREATE TABLE dbo.DataType
(
ID int IDENTITY(1,1),
TypeName nvarchar(255),
[TypeProperty] nvarchar(255),
CONSTRAINT PK_DataType PRIMARY KEY (ID)
);
INSERT dbo.DataType(TypeName, [TypeProperty]) VALUES (N'name 1', N'property 1');
GO
Затем процедура:
CREATE PROCEDURE dbo.MergeDataType
@ID int = NULL,
@TypeName nvarchar(255),
@TypeProperty nvarchar(255)
AS
BEGIN
SET NOCOUNT ON;
WITH [source](ID, TypeName, [TypeProperty]) AS
(
SELECT @ID, @TypeName, @TypeProperty
)
MERGE dbo.DataType WITH (HOLDLOCK) AS [target]
USING [source] ON [target].ID = [source].ID
WHEN MATCHED THEN
UPDATE SET [target].TypeName = @TypeName,
[target].[TypeProperty] = @TypeProperty
WHEN NOT MATCHED THEN
INSERT (TypeName, [TypeProperty])
VALUES (@TypeName, @TypeProperty);
END
GO
Теперь давайте запустим его и проверим результаты:
EXEC dbo.MergeDataType
@TypeName = N'foo',
@TypeProperty = N'bar';
EXEC dbo.MergeDataType
@ID = 1,
@TypeName = N'name 1',
@TypeProperty = N'new property';
GO
SELECT ID, TypeName, [TypeProperty] FROM dbo.DataType;
GO
Очистить:
DROP TABLE dbo.DataType;
DROP PROCEDURE dbo.MergeDataType;