【发布时间】:2018-11-13 19:36:28
【问题描述】:
我正在尝试在 SQL Server 中执行一个查询,在该查询中我更新了一行,如果它不存在,则创建一行。这很好用,但在我的 Insert 语句中创建新行时,我需要从该表中为 _idref uniqueidentifier 选择一个值。
我遇到的情况是,如果选择没有返回可能的值,我需要使用 NEWID() 添加一个新的唯一标识符。
这是我的查询:
DECLARE @LGRACT BIGINT
DECLARE @SUBACT BIGINT
DECLARE @AMOUNT DECIMAL(12,2)
DECLARE @PostYear SMALLINT
DECLARE @PostMonth TINYINT
SET @PostYear = 2018
SET @PostMonth = 12
SET @LGRACT = 6000
SET @SUBACT = 200
SET @AMOUNT = 2000.00
UPDATE [Services Copy].dbo.lgrbal
SET balance = ((SELECT balance
FROM [Services Copy].dbo.lgrbal
WHERE lgract = @LGRACT
AND postyr = @PostYear
AND actprd = @PostMonth) + @AMOUNT)
WHERE lgract = @LGRACT
AND postyr = @PostYear
AND actprd = @PostMonth
IF @@ROWCOUNT = 0
INSERT INTO [Services Copy].dbo.lgrbal (_idnum, _idref, lgract, postyr, actprd, balance)
VALUES (NEWID(),
(SELECT TOP 1 _idref
FROM [Services Copy].dbo.lgrbal
WHERE lgract = @LGRACT
AND postyr = @PostYear)
WHERE NOT EXISTS NEWID()),
@LGRACT, @PostYear, @PostMonth, @AMOUNT)
您可以在INSERT INTO VALUES 部分看到,我正在为帐户和年份返回的_idref 执行select top 1。
如果是 1 月,则不会存储其他记录,并且我没有返回 _idref。
在这种情况下,我只需将选择替换为NEWID()。
【问题讨论】:
-
创建另一个变量,在插入检查 _idref 值为 null 之前,将其设置为 NEWID,否则使用您的 SELECT。
-
您还可以使用 MERGE 命令简化事情:docs.microsoft.com/en-us/sql/t-sql/statements/…
标签: sql sql-server sql-update sql-insert