2017-12-07 2 views
0

Nicht sicher, ob IF/ELSE der richtige Weg für die folgenden ist. Es gibt immer ELSE zurück, so dass es scheint, dass es nicht richtig funktioniert.TSQL IF/ELSE oder CASE (UPSERT)

IF ((SELECT COUNT(CAST(StudentuserID AS int)) FROM StudentAttendance WHERE StudentUserID=1)>0) 
PRINT 'Yes' 
ELSE 
PRINT 'No' 

Dieser Test sollte in yes führen, da die Daten 8>0
ist, werde ich PRINT mit einer UPDATE ELSE INSERT Anweisung ersetzt werden.

IF ((SELECT COUNT(CAST(StudentuserID AS int)) FROM StudentAttendance WHERE StudentUserID=1)>0) 
UPDATE StudentAttendance 
SET 
CID = CAST('[querystring:CID]' AS int), 
CalendarEventID = CAST('[querystring:CEID]' AS int), 
StudentUserID = CAST('[StudentUserID]' AS int), 
Attendance = '[Attendance]' 
ELSE 
INSERT INTO StudentAttendance 
(CID,CalendarEventID,StudentUserID,Attendance) 
VALUES 
(CAST('[querystring:CID]' AS int), CAST('[querystring:CEID]' AS int), CAST('[StudentsUserID]' AS int),'[Attendance]') 
+2

[ 'MERGE'] (https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql) kann UPSERT . –

+0

@AlexK. Hast du ein Beispiel? – UserSN

+0

https://stackoverflow.com/questions/2479488/syntax-for-single-row-merge-upsert-in-sql-server –

Antwort

1

Es ist wie Ihr IF/ELSE funktionieren würde gut aussieht (es sieht aus wie Sie dies in einer Stored Procedure oder etwas für einen Datensatz tun?). Wenn es zur Zeit ist ‚Nein‘ zurückkehrt und Sie nicht denken, es sein sollte, würde ich vielleicht eine grundlegende Überprüfung auf den Tisch tun, zum Beispiel:

SELECT * 
FROM StudentAttendance 
WHERE StudentUserID = 1 

Sie können auch eine MERGE Erklärung für diese, und Sie können mehrere Quellentabellen verwenden, indem Sie sie innerhalb des USING Teils verbinden. Hier ist ein einfaches Beispiel dafür:

DECLARE @A table (Aid int, value int) 
DECLARE @B table (Aid int, Cid int) 
DECLARE @C table (Cid int, value int) 

INSERT INTO @A VALUES (1, 1) 
INSERT INTO @B VALUES (1, 2) 
INSERT INTO @B VALUES (2, 3) 
INSERT INTO @C VALUES (2, 4) 
INSERT INTO @C VALUES (3, 6) 
; 

SELECT * 
FROM @A 
; 

MERGE INTO @A tgt 
USING (SELECT B.Aid, B.Cid, C.value FROM @B B JOIN @C C ON B.Cid = C.Cid) src 
ON tgt.Aid = src.Aid 

WHEN MATCHED THEN UPDATE 
SET tgt.value = src.value 

WHEN NOT MATCHED THEN 
INSERT 
(
    Aid 
    , value 
) 

VALUES 
(
    src.Aid 
    , src.value 
) 
; 

SELECT * 
FROM @A 
; 
+0

vielen Dank für Ihr Beispiel. Ich hatte eine zweite Frage für dieses Problem mit "MERGE" erstellt, wie Sie beschrieben haben. Ich hatte ein Problem mit Einsätzen unabhängig von den Bedingungen, aber ich werde diese Antwort überprüfen und sehen, wie weit ich kommen kann. Vielen Dank. https://stackoverflow.com/questions/47700748/tsql-merge-with-multiple-sources/47701401?noredirect=1#comment82365269_47701401 – UserSN