2016-05-26 9 views
0

私はクエリを持っています。私はそれの列として名前とIDを持つデータベーステーブルを持っています。このテーブルには22行の情報があります。Microsoft SQL Serverを使用してテーブル全体をデータベースに保存します

ここで、このデータを取得してUIに表示します。ユーザーは新しい行を追加したり、行を削除したり、テーブルを保存したりすることができます。

ユーザーが[保存]をクリックすると、テーブル全体が既に存在するテーブルに置き換えられます。これはストアドプロシージャを介して実行されます。

最初にデータベーステーブル全体が消去され、新しいエントリが保存されます。

しかし、3-4行を追加して保存すると、データベースが削除されますが、新しく追加された22行+3行がテーブルに更新されないことがあります。

テーブルを簡単に交換する方法を教えてもらえますか?

PS。テーブルには一意のIDはありません。だから私は行を更新することはできません。私はすべてを削除して、新しいテーブルの行を保存する必要があります。

ストアドプロシージャ:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [DATABASE1].[sp_usertable] 
    (@in_params AS XML) 
AS 
BEGIN 
    DELETE FROM dbo.usertable; 

    SELECT 
     T.x.value('./Name[1]','varchar(25)') as [Name] , 
     T.x.value('./ID[1]','varchar(6)') as [ID] , 
    INTO 
     #Temp 
    FROM 
     @in_params.nodes('/ArrayOfData/Data') as T(x); 

    BEGIN TRANSACTION 
     INSERT INTO [dbo].[usertable] (Name, ID) 
      SELECT Name, ID 
      FROM #Temp T 

    COMMIT TRANSACTION 

    DROP TABLE #Temp; 
END 
+0

は、このMicrosoft SQL Serverまたは[mysql](http://www.mysql.com/)ですか? –

+0

@ JeffPuckettII- Microsoft SQL Server – Patrick

+0

@patrickテーブル全体を削除する理由は何ですか?なぜ今テーブルの行を挿入/更新/削除するのですか? – Hiten004

答えて

1

あなたは一時テーブルの使用を省略し、直接あなたの永久テーブルに選択し、削除ができます#TEMP存在の

USE [DATABASE1] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 


ALTER PROCEDURE [DATABASE1].[sp_usertable] 

(
@in_params AS XML 
) 
AS 
BEGIN 

    DROP TABLE dbo.usertable; 

    select 
    T.x.value('./Name[1]','varchar(25)') as [Name] , 
    T.x.value('./ID[1]','varchar(6)') as [ID] , 
    into [dbo].[usertable] 
    from @in_params.nodes('/ArrayOfData/Data') as T(x); 


    END 
1

チェックと

を選択する前にドロップします
if OBJECT_ID('tempdb..#TEMP') is not null 
    BEGIN 
     DROP TABLE #TEMP 
    END 

#tempの名前をこのsp固有のものに変更します。 - #ut #tempは一般的な使い方だと思っています。また、エラートラッピングを追加することを検討することもできます。

関連する問題