Sql server 关键字“Select”附近的语法不正确。平衡码

Sql server 关键字“Select”附近的语法不正确。平衡码,sql-server,subquery,Sql Server,Subquery,这发生在4号线 UPDATE CashBalances SET Balance1=0, Balance2=0 WHERE PID=100040 AND Date='20081024' IF @@ROWCOUNT=0 INSERT INTO CashBalances(PID,Date,BalanceCode,Balance1,Balance2,CCY) VALUES (100040 ,'20081024', (SELECT TOP 1 balan

这发生在4号线

UPDATE CashBalances 
   SET Balance1=0,
       Balance2=0 
 WHERE PID=100040 
   AND Date='20081024' 

IF @@ROWCOUNT=0 
  INSERT INTO CashBalances(PID,Date,BalanceCode,Balance1,Balance2,CCY)
    VALUES (100040 ,'20081024', (SELECT TOP 1 balancecode 
                                   FROM cashbalances 
                                  WHERE date=(SELECT MAX(Date) 
                                                FROM CashBalances 
                                               WHERE PID=100040) 
  IF @@ROWCOUNT = 0 SELECT 'I' AS balancecode),0,0,' ') 
我正在尝试从特定pid检索一个balancecode,其中date是最大值。 如果返回零行,则将“I”作为余额代码返回


谢谢。

只需创建另一个valiable,然后插入:

IF (SELECT COUNT(PID) FROM CashBalances WHERE PID=100040) > 0
BEGIN
    UPDATE CashBalances SET Balance1=0,Balance2=0 WHERE PID=100040 AND Date='20081024';
END
ELSE
BEGIN
    --Here your create it, could be that you use different type
    DECLARE @ConditionalValue NVARCHAR(MAX) = 'I';

    --Here you set it with a right value that you need on condition
    IF @@ROWCOUNT > 0 
    SET @ConditionalValue = (SELECT TOP 1  
                                FROM cashbalances 
                                WHERE date=(SELECT MAX(Date) 
                                        FROM CashBalances 
                                        WHERE PID=100040))
    --Insert your final value
    INSERT INTO CashBalances(PID, Date, BalanceCode, Balance1, Balance2, CCY)
    VALUES (100040 ,'20081024', @ConditionalValue,0,0,' ')
END

要么坚持选择,要么选择值。不是两者都有。正如Arvo提到的,在查询中不能使用if。您可以使用用例,但这里不需要它

update CashBalances 
set Balance1=0, Balance2=0 
where PID=100040 AND Date='20081024' 

if @@ROWCOUNT=0 
Begin
    declare @Balancecode char(1)='I'

    select top 1 @Balancecode =  balancecode
    from cashbalances cb
    where PID=100040
    order by date desc

    insert into CashBalances(PID,Date,BalanceCode,Balance1,Balance2,CCY)
    values (100040 ,'20081024', @balanceCode,0,0,' ')
end

你可以用以下不同的方式来做

如果PID=100040和Date='20081024'上没有数据,则插入查询将起作用

DECLARE @Query NVARCHAR(MAX) = '
    INSERT INTO CashBalances(PID,Date,BalanceCode,Balance1,Balance2,CCY)
    VALUES 
    (
        100040 ,
        ''20081024'',
        COALESCE ((SELECT TOP 1 balancecode FROM cashbalances WHERE date=(SELECT MAX(Date) FROM CashBalances WHERE PID=100040), ''I'',
        0,
        0,
        '' ''
    )';


SELECT @Query = 'UPDATE CashBalances 
                    SET Balance1=0,
                    Balance2=0 
                  WHERE PID=100040 
                 AND Date=''20081024''
                 '
WHERE 
    PID=100040 AND 
    Date='20081024' 


EXECUTE sp_executesql @Query

您不能在子查询中使用IF。您应该努力与SQL关键字的编写方式保持一致-要么全部使用大写的SELECT、FROM,要么全部使用小写的SELECT、FROM,或者混合使用大小写SELECT、FROM-但请选择一种样式,然后坚持使用它-不要将所有样式混合在一起@谢谢你的反馈。我更喜欢小写,但复制了一些代码。我已经更新了我的答案。在这段代码中,将始终有一个插入。我认为只有在没有行更新的情况下才应该进行更新。问题中有“@@ROWCOUNT=0”。@Peter可能是,让我们等待更多信息details@Peter你说得对,它总是插入一条新记录。@Nkhumisenikholophe,你需要总是插入吗?是否?@Teo van kot-如果该记录在该日期PID=100040,则不插入新行,只需更新余额1和2即可。其他插入
UPDATE CashBalances SET Balance1=0,Balance2=0 WHERE PID=258 AND 
Date='20081024' 

IF @@ROWCOUNT = 0  
BEGIN 
DECLARE @BalCode Char(1) 
SET @BalCode = ISNULL((SELECT TOP 1 Balancecode
FROM CashBalances 
WHERE Date=(SELECT MAX(Date) FROM CashBalances WHERE PID=258)),'I')

INSERT INTO CashBalances(PID,Date,BalanceCode,Balance1,Balance2,CCY)
VALUES (258 ,'20081024',@BalCode,0,0,' ')
END

--- @ teo van tok