2017-06-13 2 views
1

Dies geschieht auf der Leitung 4.falsche Syntax in der Nähe des Schlüsselwortes 'Auswählen'. für ein balancecode

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,' ') 

ich balancecode abzurufen versuchen, wo Datum der max von einem bestimmten pid ist. Wenn Nullzeilen zurückgegeben werden, geben Sie 'I' als einen Balancecode zurück.

Danke.

+3

Sie können nicht in Unterabfrage verwenden 'IF'. – Arvo

Antwort

1

Just another valiable erstellen und dann einfügen:

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 
+0

In diesem Code wird immer eine Einfügung sein. Ich denke, es sollte nur ein Update geben, wenn keine Zeilen aktualisiert wurden. In der Frage gibt es '@@ ROWCOUNT = 0'. – Peter

+0

@Peter könnte sein, lassen Sie uns warten OP für weitere Details –

+0

@Peter Sie haben Recht, es ist immer ein neues Album einfügen. –

1

Entweder bleiben Sie wählen oder Werte. Nicht beide. Wie von Arvo erwähnt, können Sie in einer Abfrage nicht verwenden. Sie können stattdessen die Groß-/Kleinschreibung verwenden, aber Sie brauchen sie hier nicht.

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 
+0

Sie sollten sich bemühen, ** konsequent * * mit, wie Sie die SQL-Schlüsselwörter schreiben - * entweder * schreibe sie in allen GROßEN (SELECT, FROM), oder schreibe sie in Kleinbuchstaben (wählen, von), oder in Großbuchstaben (Wählen, Von) - aber bitte ** wählen ein Stil ** und dann ** bleibe dabei ** - vermische sie nicht alle zusammen! –

+0

@marc_s Vielen Dank für Ihr Feedback. Ich bevorzuge Kleinbuchstaben, kopiere aber etwas vom Code. Ich habe meine Antwort aktualisiert. – Peter

0

Sie können es auf eine andere Weise wie folgt tun.

Wenn keine Daten zu PID=100040 AND Date='20081024' vorhanden sind, wird die Abfrage einfügen funktionieren.

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 
0
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 
Verwandte Themen