SQLサーバーへのデータテーブルの挿入/更新を試みるために次の解決策を試しましたが、いくつかの問題が発生しました。http://www.aspsnippets.com/Articles/SqlBulkCopy--Bulk-Insert-records-and-Update-existing-rows-if-record-exists-using-C-and-VBNet.aspx
CREATE TABLE [dbo].[People](
[ID] [varchar](10) NOT NULL,
[Name] [varchar](50) NULL,
[Email] [varchar](50) NULL,
[Country] [varchar](50) NULL
) ON [PRIMARY]
CREATE TYPE [dbo].[PeopleType] AS TABLE(
[ID] [varchar](10) NOT NULL,
[Name][varchar](50) NULL,
[Email][varchar](50) NULL
)
CREATE PROCEDURE [dbo].[Update_People]
@tblpeople PeopleType READONLY
AS
BEGIN
SET NOCOUNT ON;
MERGE INTO People p1
USING @tblpeople p2
ON p1.ID=p2.ID
WHEN MATCHED THEN
UPDATE SET p1.Name = p2.Name
,p1.Email = p2.Email
WHEN NOT MATCHED THEN
INSERT VALUES(p2.ID, p2.Name, p2.Email);
END
しかし、ユーザー定義のテーブルタイプを使用してプロシージャを作成しようとすると、SQLサーバーエラーが発生しました。
列名または指定された値の数がテーブル定義と一致しません。」
私は何か間違ったことをしたか、何かを逃しましたか?
Insert
国を追加したくない場合は、ステートメントを次のように変更します。
INSERT INTO People(Id, Email, Name) VALUES(p2.ID, p2.Name, p2.Email);
エラーが発生する理由は、Insert
ステートメントを使用する列を指定していないためです。テーブルには4が定義されているため4が必要です。しかし、あなたは3つしか提供しません。
もう1つのオプションは、Countryプロパティをユーザー定義の型に追加し、次の手順で国を追加することです。
CREATE TYPE [dbo].[PeopleType] AS TABLE(
[ID] [varchar](10) NOT NULL,
[Name][varchar](50) NULL,
[Email][varchar](50) NULL,
[Country][varchar](50) NULL
)
INSERT VALUES(p2.ID, p2.Name, p2.Email, p2.Country);
編集:私はしばらくこれを使用していないので、構文についてはわかりませんが、次のような列名を指定するだけでよい可能性があります:
INSERT (Id, Email, Name) VALUES(p2.ID, p2.Name, p2.Email);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加