Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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
Sql server 合并到带有参数的表中_Sql Server_Tsql_Parameters_Merge_Sql Insert - Fatal编程技术网

Sql server 合并到带有参数的表中

Sql server 合并到带有参数的表中,sql-server,tsql,parameters,merge,sql-insert,Sql Server,Tsql,Parameters,Merge,Sql Insert,我被困住了,我知道这比我想象的要容易 我有一张这样的桌子: SELECT ID , NAME , CITY FROM TEMP 我已经创建了一个带有参数的Merge语句,如果ID和City不存在,它应该插入一个新行 ALTER PROCEDURE [dbo].[sp_TMP] @ID INT, @City NVARCHAR(50) AS MERGE TEMP AS TARGET USING ( SELECT ID, NAME, CITY FROM TEM

我被困住了,我知道这比我想象的要容易

我有一张这样的桌子:

SELECT ID , NAME , CITY FROM TEMP

我已经创建了一个带有参数的Merge语句,如果ID和City不存在,它应该插入一个新行

ALTER PROCEDURE [dbo].[sp_TMP]

@ID INT, 
@City NVARCHAR(50) 

AS

MERGE TEMP AS TARGET
USING 
(
SELECT 
    ID,
    NAME,
    CITY
FROM TEMP

) AS SOURCE 
    ON [TARGET].[ID]=  @ID AND [TARGET].[City] = @City 

WHEN NOT MATCHED THEN
INSERT 
(   
    [ID],
    [NAME],
    [CITY]

)
VALUES
(
   @ID,
   [SOURCE].[NAME],
   @City

);
我知道我在这里做错了什么,因为所有的记录都会生效

我想要一个结果(如果@ID='1'和@City='newyork')


如果可能的话,我想使用MERGE()而不是“Insert into”。

首先,我想说,像这样的解决方案的一致性根本不好

但是,为了使其按照您在注释中所述的方式工作,请按如下方式更改代码:

ALTER PROCEDURE [dbo].[sp_TMP]

@ID INT, 
@City NVARCHAR(50) 

AS

MERGE TEMP AS TARGET
USING 
(
SELECT 
    ID,
    NAME,
    CITY
FROM TEMP

) AS SOURCE 
    ON [TARGET].[ID]= @ID AND [TARGET].[City] = @City

WHEN NOT MATCHED THEN
INSERT 
(   
    [ID],
    [NAME],
    [CITY]

)
VALUES
(
   @ID,
   (SELECT TOP(1) t.Name FROM TEMP t WHERE t.ID = @ID),
   @City

);
我们应该做到这一点

另外,我不知道为什么您只想使用
合并
,但如果不存在,这将是
的一个很好的候选者。。。像这样插入到

ALTER PROCEDURE [dbo].[sp_TMP]

@ID INT, 
@City NVARCHAR(50) 

AS

IF NOT EXISTS (SELECT TOP(1) 1 FROM TEMP WHERE ID = @ID AND City = @City)
  INSERT INTO TEMP(ID, City, Name)
     VALUES (@ID, @City, (SELECT TOP(1) Name FROM TEMP WHERE ID = @ID));

如果您使用的是代码优先的方法,您只需使用[Index(IsUnique=true)]即可尝试此方法。例如:

    [Required]
    [Column(TypeName = "varchar")]
    [StringLength(100)]
    [Index(IsUnique = true)]
    public string Name { get; set; }

如果您使用
@ActivityID=1
@City='New York'
调用它,引擎如何知道您希望它只为
名称插入
'Steve'
?我已经更新了问题[@]Activity应该是[@]ID…。我的问题仍然有效…引擎如何知道您要插入
(ID,City)=(1,'New York'))
只为史蒂夫这个名字?是因为
ID=1
中的其他行的名称是Steve吗?是的,因为我不想创建一个新参数,在该参数中,我应该为name列指定“Steve”。我可能在这里想错了(?)那么就关系数据库而言,结构是错误的,它应该类似于
Person(ID,Name)
,然后您应该只引用该表
TEMP(PersonID,City)
。但是,如果一个ID的名称总是相同的,我会在一分钟后在回答部分快速地做一些事情。我已经更新了我所追求的东西的图片,这是否更有意义,或者你的示例仍然相同?代码应该仍然有效。我也用了另一种方法谢谢,这就是我想要的。也许不是最好的方法,但它是有效的:)很高兴能帮上忙