我尝试过在使用SQL代码更新或插入时在本网站上找到的不同解决方案,我得到了更新,但如果行不存在则无法实现工作插入,工作的(更新)代码看起来像这样,任何有关如何使其插入的帮助也会很好,因为我是一个* SQL新手,这里是工作代码:
select top 0 * into #tmp_x from TTT;
select * from #tmp_x;
BULK INSERT #tmp_x FROM 'path\to\file1.csv' WITH (FIELDTERMINATOR =';',ROWTERMINATOR ='\n' ,FIRSTROW = 2);
UPDATE TTT
SET TTT.[Artikelbenämning] = #tmp_x.[Artikelbenämning],TTT.[Count of Ordernummer] = #tmp_x.[Count of Ordernummer],TTT.[Sum of Antal beställda] = #tmp_x.[Sum of Antal beställda],TTT.[Min of Skapat Datum] = #tmp_x.[Min of Skapat Datum],TTT.[Max of Planerat Plockdatum] = #tmp_x.[Max of Planerat Plockdatum],TTT.[Kommentar Inköpsplanerare] = #tmp_x.[Kommentar Inköpsplanerare]
FROM #tmp_x
WHERE TTT.Artikelnummer = #tmp_x.Artikelnummer;
drop table #tmp_x;
print 'dropped table';
答案 0 :(得分:3)
如果您有SQL Server 2008或更高版本,则可以使用MERGE语句。以下Microsoft TechNet文章很好地描述了合并语句: https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx
您的查询应如下所示:
BULK INSERT #tmp_x FROM 'path\to\file1.csv' WITH (FIELDTERMINATOR =';',ROWTERMINATOR ='\n' ,FIRSTROW = 2);
MERGE TTT AS T
USING #tmp_x AS S
ON (T.Artikelnummer = S.Artikelnummer)
WHEN NOT MATCHED BY TARGET
THEN INSERT(
[Artikelnummer]
,[Artikelbenämning]
,[Count of Ordernummer]
,[Sum of Antal beställda]
,[Min of Skapat Datum]
,[Max of Planerat Plockdatum]
,[Kommentar Inköpsplanerare]
)
VALUES(
S.[Artikelnummer]
,S.[Artikelbenämning]
,S.[Count of Ordernummer]
,S.[Sum of Antal beställda]
,S.[Min of Skapat Datum]
,S.[Max of Planerat Plockdatum]
,S.[Kommentar Inköpsplanerare]
)
WHEN MATCHED
THEN UPDATE
SET T.[Artikelbenämning] = S.[Artikelbenämning]
,T.[Count of Ordernummer] = S.[Count of Ordernummer]
,T.[Sum of Antal beställda] = S.[Sum of Antal beställda]
,T.[Min of Skapat Datum] = S.[Min of Skapat Datum]
,T.[Max of Planerat Plockdatum] = S.[Max of Planerat Plockdatum]
,T.[Kommentar Inköpsplanerare] = S.[Kommentar Inköpsplanerare];
,T.[Kommentar Inköpsplanerare] = ISNULL(S.[Kommentar Inköpsplanerare], T.[Kommentar Inköpsplanerare]);
-- Example exludes records where [Kommentar Inköpsplanerare] IS NULL from the merge
MERGE TTT AS T
USING (
SELECT
[Artikelnummer]
,[Artikelbenämning]
,[Count of Ordernummer]
,[Sum of Antal beställda]
,[Min of Skapat Datum]
,[Max of Planerat Plockdatum]
,[Kommentar Inköpsplanerare]
FROM #tmp_x
WHERE [Kommentar Inköpsplanerare] IS NOT NULL
)AS S
ON (T.Artikelnummer = S.Artikelnummer)
WHEN NOT MATCHED BY TARGET
THEN INSERT(
[Artikelnummer]
,[Artikelbenämning]
,[Count of Ordernummer]
,[Sum of Antal beställda]
,[Min of Skapat Datum]
,[Max of Planerat Plockdatum]
,[Kommentar Inköpsplanerare]
)
VALUES(
S.[Artikelnummer]
,S.[Artikelbenämning]
,S.[Count of Ordernummer]
,S.[Sum of Antal beställda]
,S.[Min of Skapat Datum]
,S.[Max of Planerat Plockdatum]
,S.[Kommentar Inköpsplanerare]
)
WHEN MATCHED
THEN UPDATE
SET T.[Artikelbenämning] = S.[Artikelbenämning]
,T.[Count of Ordernummer] = S.[Count of Ordernummer]
,T.[Sum of Antal beställda] = S.[Sum of Antal beställda]
,T.[Min of Skapat Datum] = S.[Min of Skapat Datum]
,T.[Max of Planerat Plockdatum] = S.[Max of Planerat Plockdatum]
,T.[Kommentar Inköpsplanerare] = S.[Kommentar Inköpsplanerare];
-- Example ignores updates on the [Kommentar Inköpsplanerare] column if the [Kommentar Inköpsplanerare] IS NULL in the source dataset
MERGE TTT AS T
USING #tmp_x AS S
ON (T.Artikelnummer = S.Artikelnummer)
WHEN NOT MATCHED BY TARGET
THEN INSERT(
[Artikelnummer]
,[Artikelbenämning]
,[Count of Ordernummer]
,[Sum of Antal beställda]
,[Min of Skapat Datum]
,[Max of Planerat Plockdatum]
,[Kommentar Inköpsplanerare]
)
VALUES(
S.[Artikelnummer]
,S.[Artikelbenämning]
,S.[Count of Ordernummer]
,S.[Sum of Antal beställda]
,S.[Min of Skapat Datum]
,S.[Max of Planerat Plockdatum]
,S.[Kommentar Inköpsplanerare]
)
WHEN MATCHED
THEN UPDATE
SET T.[Artikelbenämning] = S.[Artikelbenämning]
,T.[Count of Ordernummer] = S.[Count of Ordernummer]
,T.[Sum of Antal beställda] = S.[Sum of Antal beställda]
,T.[Min of Skapat Datum] = S.[Min of Skapat Datum]
,T.[Max of Planerat Plockdatum] = S.[Max of Planerat Plockdatum]
,T.[Kommentar Inköpsplanerare] = ISNULL(S.[Kommentar Inköpsplanerare], T.[Kommentar Inköpsplanerare]);
答案 1 :(得分:1)
在Sql server中,您可以在同一语句中执行插入和更新,称为MERGE
MERGE TTT AS target
USING #tmp_x AS source
ON (target.Artikelnummer = source.Artikelnummer )
WHEN MATCHED THEN
UPDATE SET [Artikelbenämning] = source.[Artikelbenämning],
[Count of Ordernummer] = source.[Count of Ordernummer],
[Sum of Antal beställda] = source.[Sum of Antal beställda]....
WHEN NOT MATCHED THEN
INSERT (<target's columns list>) -- I got a little lazy here...
VALUES (<source's columns list>)
答案 2 :(得分:0)
@Edmond Quinton的替代方案是删除匹配的行并插入:
{
name:"room A",
bookings: [
{start:"10:00 AM", end:"12:00 AM", user:"Ram Sen"},
{start:"08:00 AM", end:"09:00 AM", user:"Sam Roy"},
{start:"01:00 PM", end:"3:00 PM", user:"Jadu Dey"}
]
}