Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Sql Server中插入或更新多行_Php_Sql_Sql Server - Fatal编程技术网

Php 在Sql Server中插入或更新多行

Php 在Sql Server中插入或更新多行,php,sql,sql-server,Php,Sql,Sql Server,我需要执行如下所示的查询。列KEY1和KEY2是不能重复的键。如果有匹配的键,我需要执行更新VAL而不是插入。如何在Sql Server中实现这一点 INSERT INTO tableA ( KEY1, KEY2, VAL, ) VALUES ( -- Row A 'datakeyA1', 'datakeyA2', 'somev

我需要执行如下所示的查询。列KEY1和KEY2是不能重复的键。如果有匹配的键,我需要执行更新VAL而不是插入。如何在Sql Server中实现这一点

INSERT INTO tableA
  ( 
      KEY1,
      KEY2,
      VAL,                      
  ) VALUES (
          -- Row A
          'datakeyA1',
          'datakeyA2',
          'somevaluetoinsertorupdate'
      ) , (
          -- Row B
          'datakeyB1',
          'datakeyB2',
          'somevaluetoinsertorupdate'
      ) , (
          -- Row C
          'datakeyC1',
          'datakeyC2',
          'somevaluetoinsertorupdate'
      );
我尝试过使用MERGE,但从语法上看,我不确定它是否支持更新/插入多行。如果有人在过去遇到过类似的情况,你能帮忙吗

编辑:

如果我使用的是MySql,我会使用:

ON DUPLICATE KEY UPDATE 
 VAL = VALUES(VAL)
在查询中。

您可以使用a作为源表,以便使用
MERGE

MERGE tableA AS t
USING (VALUES 
        ('datakeyA1', 'datakeyA2', 'somevaluetoinsertorupdate'), 
        ('datakeyB1', 'datakeyB2', 'somevaluetoinsertorupdate'),
        ('datakeyC1', 'datakeyC2', 'somevaluetoinsertorupdate')
    ) AS s (Key1, Key2, Val)
        ON s.Key1 = t.Key1
        AND s.Key2 = t.Key2
WHEN MATCHED THEN 
    UPDATE 
    SET    Val = s.Val
WHEN NOT MATCHED THEN 
    INSERT (Key1, Key2, Val)
    VALUES (s.Key1, s.Key2, s.Val);

试着像这样使用合并:

MS SQL Server 2008架构设置

CREATE TABLE tableA
(
    KEY1 VARCHAR(50),
    KEY2 VARCHAR(50),
    VAL VARCHAR(50)
    PRIMARY KEY (Key1, Key2)         
) 

INSERT INTO tableA
VALUES ('datakeyA1', 'datakeyA2', 'somevaluetoinsertorupdate')
MERGE  tableA AS T
USING
    (VALUES ('datakeyA1','datakeyA2','SOME NEW VALUE'), 
            ('datakeyB1','datakeyB2','somevaluetoinsertorupdate'), 
            ('datakeyC1','datakeyC2','somevaluetoinsertorupdate')) AS S(Key1, Key2, Val) 
ON (S.Key1 = T.Key1 AND S.Key2 = T.Key2)
WHEN MATCHED
    THEN UPDATE SET T.Val = S.Val
WHEN NOT MATCHED BY TARGET
    THEN INSERT (Key1, Key2, VAL) VALUES (S.Key1, S.Key2, S.Val);

SELECT *
FROM tableA
|      KEY1 |      KEY2 |                       VAL |
|-----------|-----------|---------------------------|
| datakeyA1 | datakeyA2 |            SOME NEW VALUE |
| datakeyB1 | datakeyB2 | somevaluetoinsertorupdate |
| datakeyC1 | datakeyC2 | somevaluetoinsertorupdate |
查询1

CREATE TABLE tableA
(
    KEY1 VARCHAR(50),
    KEY2 VARCHAR(50),
    VAL VARCHAR(50)
    PRIMARY KEY (Key1, Key2)         
) 

INSERT INTO tableA
VALUES ('datakeyA1', 'datakeyA2', 'somevaluetoinsertorupdate')
MERGE  tableA AS T
USING
    (VALUES ('datakeyA1','datakeyA2','SOME NEW VALUE'), 
            ('datakeyB1','datakeyB2','somevaluetoinsertorupdate'), 
            ('datakeyC1','datakeyC2','somevaluetoinsertorupdate')) AS S(Key1, Key2, Val) 
ON (S.Key1 = T.Key1 AND S.Key2 = T.Key2)
WHEN MATCHED
    THEN UPDATE SET T.Val = S.Val
WHEN NOT MATCHED BY TARGET
    THEN INSERT (Key1, Key2, VAL) VALUES (S.Key1, S.Key2, S.Val);

SELECT *
FROM tableA
|      KEY1 |      KEY2 |                       VAL |
|-----------|-----------|---------------------------|
| datakeyA1 | datakeyA2 |            SOME NEW VALUE |
| datakeyB1 | datakeyB2 | somevaluetoinsertorupdate |
| datakeyC1 | datakeyC2 | somevaluetoinsertorupdate |

CREATE TABLE tableA
(
    KEY1 VARCHAR(50),
    KEY2 VARCHAR(50),
    VAL VARCHAR(50)
    PRIMARY KEY (Key1, Key2)         
) 

INSERT INTO tableA
VALUES ('datakeyA1', 'datakeyA2', 'somevaluetoinsertorupdate')
MERGE  tableA AS T
USING
    (VALUES ('datakeyA1','datakeyA2','SOME NEW VALUE'), 
            ('datakeyB1','datakeyB2','somevaluetoinsertorupdate'), 
            ('datakeyC1','datakeyC2','somevaluetoinsertorupdate')) AS S(Key1, Key2, Val) 
ON (S.Key1 = T.Key1 AND S.Key2 = T.Key2)
WHEN MATCHED
    THEN UPDATE SET T.Val = S.Val
WHEN NOT MATCHED BY TARGET
    THEN INSERT (Key1, Key2, VAL) VALUES (S.Key1, S.Key2, S.Val);

SELECT *
FROM tableA
|      KEY1 |      KEY2 |                       VAL |
|-----------|-----------|---------------------------|
| datakeyA1 | datakeyA2 |            SOME NEW VALUE |
| datakeyB1 | datakeyB2 | somevaluetoinsertorupdate |
| datakeyC1 | datakeyC2 | somevaluetoinsertorupdate |

合并支持多行。为什么不呢?您是否正在尝试
批量插入/更新
当不匹配时,我尝试
然后插入(KEY1,KEY2,VAL)值('datakeyA1','datakeyA1','datakeyA1'),('datakeyB1','datakeyB1','datakeyB1')。这似乎是无效的语法。我试图插入多行,但正在研究如何在现有数据中找到匹配的键时进行更新而不是插入。(也就是说,与MySqlI中的重复密钥更新功能相同的功能是在一个查询中搜索更新多行的解决方案,就像在MyTable(a,b,c)中插入值(1,2,3),(3,4,5),[…]),这真的做到了。谢谢