2017-02-15 4 views
1

SQL Serverと共にC#を使用しています(異なるバージョンを試したのでバージョンは関係ありません)。クエリを次のように記述します。C#で更新:タイムアウトに@@ RowCount = 0に挿入

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秒未満で実行されます。

デバッグ方法がわかりません。私は他のテーブルで同様のクエリを実行しようとすると、彼らはうまくいくようですが、再び、この特定のテーブルで失敗する理由はわかりません。

表構造がここで間違っているかもしれないものの任意のアイデア

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] 
) 

基本的なのですか?

+0

なぜ最初のレコードが利用可能かどうかと、その挿入に基づいてあるデータベースを照会し、それに応じて更新されていません。 –

+0

というのは、2つのクエリを実行する必要があり、1つのクエリを実行するよりも時間がかかるためです。さらに、このクエリには構文エラーがないため、通常と同じ速度で実行する必要があります。ではない? –

答えて

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); 
+0

私は最初にMERGEを使用していましたが、MSDNの記事では上記の方法がMERGEより高速であることを示しています。私は解決するつもりではありますが、私の質問はC#でクエリが失敗する理由ですが、直接実行すると動作します。 –

関連する問題