【发布时间】:2016-02-09 02:55:15
【问题描述】:
如果记录存在,我必须编写一个更新表的过程,否则插入数据。我从不同的列中获取以逗号分隔的字符串的记录。
例如:
ID = "2,3,4,5";
名称 = "S,D,G,H";
我采用的方法是:创建 ID 表和名称表,每个表都有单列。 (使用拆分函数,返回包含值的单列表)。然后我试图插入/更新数据。插入工作正常。但是对于更新记录,它正在使用不正确的值进行更新。
我是 SQL 新手,无法解决我做错了什么或者我的方法是否正确!请帮忙。请注意,在我的方法中,我使用 row_num 从不同的临时表中以正确的顺序选择记录。以下是我的代码:
表设计:
CREATE TABLE [dbo].[TestMultipleInsert](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
[Number] [int] NOT NULL,
[Number1] [int] NULL,
CONSTRAINT [PK_TestMultipleInsert] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
更新/插入代码
declare @names table (name varchar(50)); --Consider as split string values of Name Column
declare @numbers table (phone int); -- Consider as split string values of Number column
declare @number1s table (phone1 int); -- Consider as split string values of Number1 column
declare @MCodes table (Id int); --Consider as split string values of Id column. If Id = -1, then it's a new entry, else updated record.
-- Insert test data for running query
insert into @names (name) values('First');
insert into @names (name) values('Second');
insert into @names (name) values('Third');
insert into @names (name) values('Fourth');
insert into @numbers (phone) values(112);
insert into @numbers (phone) values(399);
insert into @numbers (phone) values(499);
insert into @numbers (phone) values(499);
insert into @number1s (phone1) values(112);
insert into @number1s (phone1) values(299);
insert into @number1s (phone1) values(399);
insert into @number1s (phone1) values(399);
insert into @MCodes (Id) values(54); --Update
insert into @MCodes (Id) values(-1); --Insert
insert into @MCodes (Id) values(50); --Update
insert into @MCodes (Id) values(-1); --Insert
--Query
insert into dbo.TestMultipleInsert (Name, Number, Number1)
select A.name, B.phone, C.phone1
from(
SELECT name,row_number() over (order by (select 0)) as row_num
FROM @names)A,
(SELECT phone,row_number() over (order by (select 0)) as row_num
FROM @numbers)B,
(SELECT phone1,row_number() over (order by (select 0)) as row_num
FROM @number1s)C,
(SELECT Id,row_number() over (order by (select 0)) as row_num
FROM @MCodes)D
where A.row_num=B.row_num and A.row_num = C.row_num and D.row_num = A.row_num and D.Id = -1
Update dbo.TestMultipleInsert
SET Name=A.Name, Number =B.phone, Number1= C.phone1
from(
SELECT name,row_number() over (order by (select 0)) as row_num
FROM @names)A,
(SELECT phone,row_number() over (order by (select 0)) as row_num
FROM @numbers)B,
(SELECT phone1,row_number() over (order by (select 0)) as row_num
FROM @number1s)C,
(SELECT Id,row_number() over (order by (select 0)) as row_num
FROM @MCodes)D
where D.row_num=B.row_num and D.row_num = C.row_num and D.row_num = A.row_num and D.Id <> -1 and D.Id = dbo.TestMultipleInsert.Id
select * from dbo.TestMultipleInsert;
任何帮助将不胜感激。
【问题讨论】:
标签: sql-server sql-server-2008 sql-update multiple-columns sql-insert