--- gitea: none include_toc: true --- # Transact-SQL ## begin transaction ``` sql begin transaction -- ...insert or whatever... commit; -- if all ok rollback; --if not ok ``` ## Check if a List of numbers exist in a table: ``` sql -- declare array DECLARE @IDList TABLE (ID INT); -- fill array INSERT INTO @IDList (ID) VALUES (274), (7238), (7546), (7719), (36227); -- create table with id and exists/not exist SELECT l.ID, CASE WHEN vv.OBJ_ID IS NOT NULL THEN 'Exists' ELSE 'Does Not Exist' END AS Status FROM @IDList l LEFT JOIN VAL vv ON l.ID = vv.OBJ_ID; ``` ## Mehrere Zeilen zusammen in 1 Zeile mergen Annahme: - Tabelle hat Spalten OBJ_ID, VAL_TEXT, FLD_ID - OBJ_ID hat mehrere Einträge, mit unterschiedlichen Werten in VAL_TEXT und FLD_ID. Halt je nach Feld andere Feldwerte. - Ich möchte eine Query, die mir 1 Zeile pro OBJ_ID ausgibt, mit 1 Spalte "url" und 1 Spalte "Name" - "url" ist in VAL_TEXT mit FLD_ID xy (in diesem Bsp. egal) enthalten - "name" ist in VAL_TEXT mit FLD_ID 40414 enthalten - Bei der Query soll nur die OBJ_ID berücksichtig werden, die in einem VAL_TEXT "%wikidata%" drin hat ``` sql WITH CTE_Wikidata AS ( -- Sammle alle OBJ_IDs, bei denen VAL_TEXT "wikidata" enthält SELECT OBJ_ID, VAL_TEXT AS url FROM VAL WHERE VAL_TEXT LIKE '%wikidata%' ), CTE_Person AS ( -- Sammle alle OBJ_IDs, bei denen FLD_ID = 240414 und die in CTE_Wikidata existieren SELECT v.OBJ_ID, v.VAL_TEXT AS person FROM VAL v INNER JOIN CTE_Wikidata wd ON v.OBJ_ID = wd.OBJ_ID WHERE v.FLD_ID = 40414 ) SELECT wd.OBJ_ID, wd.url, p.person FROM CTE_Wikidata wd LEFT JOIN CTE_Person p ON wd.OBJ_ID = p.OBJ_ID; ```