在@@ RowCount = 0上插入更新:C#

时间:2017-02-15 06:27:01

标签: c# sql sql-server

我正在使用C#和SQL Server(尝试了不同的版本,因此版本并不重要)。我写了一个查询

UPDATE tblSalesVerbiage
SET SalesID = 1,
    Message = '',
    SpanishMessage = '',
    TitleName = 'VerbiageOnline6',
    isEditable = 0
WHERE TitleName = 'VerbiageOnline6' AND SalesID = 1;

IF @@ROWCOUNT = 0
BEGIN
    INSERT INTO [tblSalesVerbiage]
                (SalesID, Message, SpanishMessage, TitleName, isEditable)
           VALUES (1, '', '', 'VerbiageOnline6', 0);
    SELECT 1;
END
ELSE SELECT 0;

查询只是尝试更新一行,如果受影响的行为0则尝试插入它。我发现基于一些研究,这比SQL Server中的其他方法更快。但是,此查询给出了此特定表的问题,如果尚未插入行或未找到行进行更新,则在运行C#代码时执行需要30秒以上。但是当直接在SSMS中运行时,它可能在不到1秒的时间内以jiffy执行。

我不确定如何调试它。我尝试在其他表上运行类似的查询,它们似乎运行良好,但再次,不知道为什么它在这个特定的表上失败。

表结构是基本的

CREATE TABLE [dbo].[tblSalesVerbiage](
    [VerbId] [int] IDENTITY(1,1) NOT NULL,
    [SalesId] [bigint] NOT NULL,
    [Message] [varchar](max) NULL,
    [TitleName] [varchar](50) NOT NULL,
    [SpanishMessage] [varchar](max) NULL,
    [IsEditable] [bit] NULL,
    CONSTRAINT [PK_tblSalesVerbiage] PRIMARY KEY CLUSTERED 
    (
        [VerbId] ASC
    ) ON [PRIMARY]
)

知道这里可能出现什么问题吗?

1 个答案:

答案 0 :(得分:0)

使用MERGE声明

MERGE [tblSalesVerbiage] a
using (VALUES (1,'','','VerbiageOnline6',0)) tc (SalesID, Message, SpanishMessage, TitleName, isEditable)
ON a.TitleName = tc.TitleName
   AND a.SalesID = tc.SalesID
WHEN matched THEN
  UPDATE SET Message = tc.SalesID,
             SpanishMessage = tc.SpanishMessage,
             isEditable = tc.isEditable
WHEN NOT matched THEN
  INSERT (SalesID,
          Message,
          SpanishMessage,
          TitleName,
          isEditable)
  VALUES (SalesID,
          Message,
          SpanishMessage,
          TitleName,
          isEditable);