Zdravím, jsem samouk začátečník přes SQL a zasekl jsem se na jednom problému. Mám tabulku, ve které je sloupec s XML a já potřebuji zachovat původní hodnotu tohoto sloupce a přidat nové hodnoty v určitém formátu, přičemž délka XML je vždy různá. Uvedu to na konkrétním případě:
Původní hodnota sloupce s XML: <DataSet><typ_vozu id="01009"/><typ_vozu id="00724"/><typ_vozu id="00725"/><typ_vozu id="00729"/></DataSet>
K původní hodnotě potřebuji přidat vůz, jehož id="00123" a tento vůz potřebuji dát před </DataSet> (</DataSet> musí být vždy na konci XML) ve stejném formátu, jako předchozí vozy
Výsledné XML by mělo vypadat takhle: <DataSet><typ_vozu id="01009"/><typ_vozu id="00724"/><typ_vozu id="00725"/><typ_vozu id="00729"/><typ_vozu id="00123"/></DataSet>
Zkoušel jsem na to přijít sám, ale nemůžu se hnout dál a potřebuji postrčit. Doufám že jsem to vysvětlil dostatečně srozumitelně a chápete, na co se snažím zeptat. Doufám že se mnou budete mít trpělivost. Předem děkuji za jakékoliv odpovědi!
EDIT: Zkoušel jsem použití substring, ale bohužel kvůli proměnlivé velikosti XML jsem musel od tohoto musel upustit (anebo jej neumím správně použít)
SQL update XML
- lamin_cz
- Level 2.5
- Příspěvky: 314
- Registrován: říjen 12
- Bydliště: Kostelec u Holešova
- Pohlaví:
- Stav:
Offline
- Kontakt:
Re: SQL update XML
UPDATE table
SET xml = REPLACE(xml, '</DataSet>', '<typ_vozu id="00123"/></DataSet>')
WHERE id = 1;
SET xml = REPLACE(xml, '</DataSet>', '<typ_vozu id="00123"/></DataSet>')
WHERE id = 1;
- CPU: Cx6x86L-PR150+
- MB: XT PRO2
- GPU: integrovaná
- RAM: 28Mb SDRAM
Re: SQL update XML
děkuji, už to funguje :)
Jenom ještě jeden menší dotaz. Mám deklarovanou hodnotu @vozy a potřebuji v podmínce, aby mi SQL pomocí "like" ověřilo, zda zda se v daném sloupci nachází hodnota @vozy (to je např id=00123). Jak se v případě deklarované hodnoty vytváří taková podmínka?
Mám to takhle, ale špatně:
declare @vozy
set @vozy = '00123'
select SLOUPEC1 from TABULKA1 where SLOUPEC1 like '%'+@vozy+'%'
Jenom ještě jeden menší dotaz. Mám deklarovanou hodnotu @vozy a potřebuji v podmínce, aby mi SQL pomocí "like" ověřilo, zda zda se v daném sloupci nachází hodnota @vozy (to je např id=00123). Jak se v případě deklarované hodnoty vytváří taková podmínka?
Mám to takhle, ale špatně:
declare @vozy
set @vozy = '00123'
select SLOUPEC1 from TABULKA1 where SLOUPEC1 like '%'+@vozy+'%'
- lamin_cz
- Level 2.5
- Příspěvky: 314
- Registrován: říjen 12
- Bydliště: Kostelec u Holešova
- Pohlaví:
- Stav:
Offline
- Kontakt:
Re: SQL update XML
select SLOUPEC1 from TABULKA1 where SLOUPEC1 like LIKE CONCAT('%', @vozy, '%');
- CPU: Cx6x86L-PR150+
- MB: XT PRO2
- GPU: integrovaná
- RAM: 28Mb SDRAM
Re: SQL update XML
SUPER! Funguje to skvěle a tak jak má. Teď jsem ve fázi ladění, kdy se snažím script zjednodušit. Jde o to, že mám několik ID vozů, které se mají zapsat k ID motoru. Chci zadat všechny ID vozů, aby se všechny automaticky přidaly k motoru a já nemusel přidávat jeden vůz po druhém ručně. Existuje v SQL nějaký způsob, nebo se to musí dělat přes PHP? Je SQL dotaz zapsán z hlediska přehlednosti a pravidel psaní kódu správně? Předem děkuji za odpovědi!
Momentálně mám script takhle:
-- ID vozů, které se mají přidat k motoru: '00000', '11111', '22222', '33333', '44444'
declare @idvozu varchar(5) = '00000' -- změníme ID vozu
declare @idmotor varchar(5) = '00184' -- změníme ID motoru
print 'Ověření, zda je vůz přiřazen k motoru a pokud ne, dojde k jeho vložení do databáze'
begin transaction
if not exists (select VOZY from DB_MOTORY where VOZY like concat ('%',@idvozu,'%') and ID = @idmotor)
begin update DB_MOTORY
set VOZY = replace(VOZY,'</DataSet>','<typ_vozu id="'+ @idvozu +'"/></DataSet>')
where (ID = @idmotor)
end
else
begin
print 'Vůz s ID= '+ @idvozu +' už je přiřazen k motoru s ID= '+ @idmotor + ' !'
end
Momentálně mám script takhle:
-- ID vozů, které se mají přidat k motoru: '00000', '11111', '22222', '33333', '44444'
declare @idvozu varchar(5) = '00000' -- změníme ID vozu
declare @idmotor varchar(5) = '00184' -- změníme ID motoru
print 'Ověření, zda je vůz přiřazen k motoru a pokud ne, dojde k jeho vložení do databáze'
begin transaction
if not exists (select VOZY from DB_MOTORY where VOZY like concat ('%',@idvozu,'%') and ID = @idmotor)
begin update DB_MOTORY
set VOZY = replace(VOZY,'</DataSet>','<typ_vozu id="'+ @idvozu +'"/></DataSet>')
where (ID = @idmotor)
end
else
begin
print 'Vůz s ID= '+ @idvozu +' už je přiřazen k motoru s ID= '+ @idmotor + ' !'
end
Re: SQL update XML
POVEDLO SE!!!
Jenom bych chtěl poprosit o vysvětlení, jak fungují a k čemu jsou příkazy CURSOR, FETCH NEXT FROM a DEALLOCATE. Nejsem dobrý angličtinář a nedokážu si to správně přeložit a pochopit. Předem díky za odpověď!
Doplnil jsem vlastní hodnoty do tohoto skriptu, co jsem našel na internetu:
DECLARE @MyCursor CURSOR;
DECLARE @MyField YourFieldDataType;
BEGIN
SET @MyCursor = CURSOR FOR
select top 1000 YourField from dbo.table
where StatusID = 7
OPEN @MyCursor
FETCH NEXT FROM @MyCursor
INTO @MyField
WHILE @@FETCH_STATUS = 0
BEGIN
/*
YOUR ALGORITHM GOES HERE
*/
FETCH NEXT FROM @MyCursor
INTO @MyField
END;
CLOSE @MyCursor ;
DEALLOCATE @MyCursor;
END;
Jenom bych chtěl poprosit o vysvětlení, jak fungují a k čemu jsou příkazy CURSOR, FETCH NEXT FROM a DEALLOCATE. Nejsem dobrý angličtinář a nedokážu si to správně přeložit a pochopit. Předem díky za odpověď!
Doplnil jsem vlastní hodnoty do tohoto skriptu, co jsem našel na internetu:
DECLARE @MyCursor CURSOR;
DECLARE @MyField YourFieldDataType;
BEGIN
SET @MyCursor = CURSOR FOR
select top 1000 YourField from dbo.table
where StatusID = 7
OPEN @MyCursor
FETCH NEXT FROM @MyCursor
INTO @MyField
WHILE @@FETCH_STATUS = 0
BEGIN
/*
YOUR ALGORITHM GOES HERE
*/
FETCH NEXT FROM @MyCursor
INTO @MyField
END;
CLOSE @MyCursor ;
DEALLOCATE @MyCursor;
END;
Re: SQL update XML
K původnímu dotazu... Řekl bych, že máš špatně navrženou databázi, když chceš do jednoho atributu cpát více hodnot. Zvaž možnost, vytvoření další tabulky.
K poslednímu dotazu... Databázový kurzor ti umožňuje přistupovat k jednotlivým řádkům tabulky. FETCH ti umožní pracovat s jedním konrétním řádkem z kurzoru. DEALLOCATE "smaže" kurzor.
K poslednímu dotazu... Databázový kurzor ti umožňuje přistupovat k jednotlivým řádkům tabulky. FETCH ti umožní pracovat s jedním konrétním řádkem z kurzoru. DEALLOCATE "smaže" kurzor.
-
- Mohlo by vás zajímat
- Odpovědi
- Zobrazení
- Poslední příspěvek
-
- 1
- 408
-
od petr22
Zobrazit poslední příspěvek
13 bře 2024 10:17
-
-
Windows Update - V zařízení chybí.... Příloha(y)
od liborek » 21 pro 2023 19:03 » v Windows 11, 10, 8... - 9
- 1331
-
od liborek
Zobrazit poslední příspěvek
23 pro 2023 16:44
-
-
-
Velké změny před námi! Update fóra a přechod na nový server
od Ltb » 15 dub 2024 12:23 » v PC-HELP -> NOVINKY - 0
- 1260
-
od Ltb
Zobrazit poslední příspěvek
15 dub 2024 12:23
-
Zpět na “Programování a tvorba webu”
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti