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的名称总是相同的,我会在一分钟后在回答部分快速地做一些事情。我已经更新了我所追求的东西的图片,这是否更有意义,或者你的示例仍然相同?代码应该仍然有效。我也用了另一种方法谢谢,这就是我想要的。也许不是最好的方法,但它是有效的:)很高兴能帮上忙