Laden...
V
Benutzerbeschreibung
Ich liebe SQL 🙂

Forenbeiträge von Viper78 Ingesamt 162 Beiträge

21.06.2010 - 15:18 Uhr

Bitte schreib mal Beispieldaten in deine Tabellen.
So ist es unmöglich dir zu helfen.

21.06.2010 - 15:11 Uhr

...
Ich möchte Kategorien erstellen können mit der Referenz auf alle Möglichkeiten der 6 Tabellen... ( Die Referenz ist wichtig für das spätere Reporting etc... )

An die Kategorien werden dann später natürlich noch mehr Infos rangehängt 😃
...

Das ist einfach. Einfach in JEDE Tabelle die Kategorie_ID hin und fertig.
Noch 6 mal FK und fertig.

21.06.2010 - 14:43 Uhr

HI,

mir ist dein gewolltes Ergebniss nicht klar.

MfG
Björn

21.06.2010 - 11:56 Uhr

Ah,

nun kommen wir dem Ziel näher 😃

Also ich sehe da immer noch kein Problem, ob
DELETE oder UPDATE mann kann beides ausführen auf jede der 80 Tabelle.

Da must du nicht erst testen, ob die ID vorhanden ist.
Die eine Transaction sollte deine Datenbank nicht sehr belasten.

Und das es vielleicht eine Fleisarbeit ist, stört doch nicht. Gehört eben dazu.

Ich kann dier natürlich auch eine aufwendige Lösung anbieten.
Lies die Master DB aus, nach den Tabellennamen, welche alle als Spalte h_id haben.
Diese verarbeitest du in eine Cursor und machst dir in der Prozedur ein Dynamisches-SQL.
z.B:

exec "UPDATE " + @TabellenNamenCursor + " WHERE h_id = " + @h_ID 

Ich weiß gerade nicht ob das 100% T-SQL 2005 ist. Bitte nachlesen. Geht ja eh nur ums Prinzip.

Viel erfolg
Björn

PS: Ich lösche auch nie Daten ^^

21.06.2010 - 11:36 Uhr

Hi,

es gibt mehrere Varianten.

1 Möglichkeit:

SELECT COUNT(*) FROM 
( 
	SELECT h_id from TABELLE1
UNION ALL 
	SELECT h_id from TABELLE2
UNION ALL 
	....
) Temp 

Eben ein SQL über alle Tabellen.

2. Möglichkeit:

Einen INSERET und DELETE Trigger pro Tabelle.
Dieser schreibt/aktualisiert beim INSERT oder DELETE
in eine Tabelle mit Spalten (h_ID , bool_SubTable) und dort Prüfst du dann. z.B:

SELECT bool_SubTable FROM SubTable WHERE h_ID = '@h_id'

3.Möglichkeit:

Du machst Constraints auf die Tabellen.
In diesem falle ist es ein FOREIGN KEY.
Dann würdest du in der HAUPTTABELLE löschen.
Wenn nun in TABELLE1 die h_id vorhanden ist,
bekommst du einen SQL-Error. Den must du dann
natürlich abfangen und so weist du nun auch das es
diese h_id in deine Subtables gibt.

Dies fiel mir erst mal ein.
So ganz verstehe ich nicht was du machen willst.
Ich versuche aber noch einen TIP:
Wenn du nur löschen willst,
dann kannst du auf alle Tabellen DELETE machen,
auch wenn die h_id nicht vorhanden ist.
Dies wird keine Probleme bereiten und
ist trotzdem schnell. (PK oder INDEX muss naturlich vorhanden sein).

MfG
Björn

21.06.2010 - 07:48 Uhr

Hi,

**Diggler **schrieb ja schon das das ein Transaction-SQL Script ist.
Du must es umschreiben auf MYSQL-Slang.

Hier findest du die DDL von MYSQL!

Und hier findest du die DDL von Transaction-SQL!

Vergleiche beide miteinander und du wirst sehr leicht die Unterschiede erkennen.

MfG
Björn

18.06.2010 - 11:42 Uhr

Normalerweise wird beim LIKE % benutzt.
Bei Access wird eben dafür * verwendet, aber nur beim Access-Designer.
Wenn du von außen drauf zu greifst, z.B. C#, etc. dann verwenden die Access-Provider die normale SQL Syntax.

Beispiel 1: LIKE in Transaction-SQL von Microsoft MSSQL Datenbank
Hier kannst du sehen das * nicht definiert ist.

Beispiel 2: Hier ist LIKE für ACCESS 2002 erklärt.

MfG
Björn

18.06.2010 - 08:48 Uhr

Hi,

ich hab da nur eine logische Erklärung.

dBASE IV ist von 1988 und da gab es DOS!
Dort durften Dateinamen nur 8+3 lang sein.

Vielleicht gilt das auch für den dBASE Provider das er die Altlast mit nehmen muss.
Also bleibt dir nichts anderes überig, die Datei nach 8+3 zu benennen.

Ich weiß das aber nicht ob das wirklich so ist. Ist eben nur eine These.

MfG
Björn

17.06.2010 - 09:15 Uhr

Hi,

es gibt 3 Lösungen.

1. Lösung:

Du baust im SQL folgendes ein:

Link:


SELECT IfNull( Name, '') FROM Adresse

Somit hast du nun immer anstelle von Null (Empty String) einen leer String ('').

2. Lösung:

In der Tabellendefinition änderst du für die Spalte "Name" eine "column_definition".

Link:


NOT NULL DEFAULT ''

So bekommst du keinen "Empty String" (NULL) sondern eine leer String ('')

3. Lösung

Link1 + Link2


String name;
name = IsDBNull( lDataReader.GetString("name";) ? '' : lDataReader.GetString("name";) ;

Hier kann man im Programm sicherstellen das eben die Meldung nicht kommt.

Fazit:

Lösung 1 + 2 sind bei der Datenbank Planung zu beachten.
Null ist schneller als '' in der Datenbank beim suchen. Details sprengen den Rahmen hier, Sorry.

Beachte auch das bei Outer Joins das Fled automatisch bei den meisten Datenbanken mit Null gefüllt wird. Somit must du bei solchen SELECT eh mit Lösung 1 oder 3 arbeiten.

Ich arbeite meist mit Lösung 1. Egal welche Datenbanksoftware.

14.06.2010 - 23:12 Uhr

Hi,

bei großen Datenbanken kann man aus Systemtabellen die Informationen auslesen.

MSSQL Server , Oracle und Firebird hab ich es selber schon gemacht. (MYSQL geht das denk ich auch)
Bei SQLite wird das wohl eher nicht funktionieren.

"frisch" hat da schon Beispiele für den MSSQL Server gepostet.
Es ist auf jeden fall der richtige Weg.
TIP: Probleme kannst du vielleicht mit den Berechtigungen in der DB bekommen. Bei "BerndFfm" und seiner Methode trift dies nicht zu.

Du wirst dich immer individuell einlesen müssen.