kostenloser Webspace werbefrei: lima-city


attribute innerhalb einer zeile selektieren

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    marius71

    marius71 hat kostenlosen Webspace.

    Hallo,
    ich arbeite zwar unter ms-sql, trotzdem denke ich kann ich meine frage im mysql forum stellen, da es sich nicht um eine syntax frage handelt. Also dann mal los..

    Erstmal eine kurze erklärung der Datenbankstruktur und zur Benutzung:

    Den benutzern steht eine Weboberfläche zur verfügung in der sie verschiedenen Daten erfassen können. Zb vorname, nachname, ort usw. Diese Daten werden in der Datenbank gespeichert und müssen später exportiert werden. Um das einlesen der exportierten daten zu gewährleisten werden die daten in einem bestimmten format exportiert. Hier hat jedes Atrribut, wie zb name, vorname, ort usw. einen start index sowie einen maximale zeichenlänge. der attribut wert steht also immer an der gleichen stelle in der textdatei. der name beginnt beispielsweise immer an stelle 1 und ist 20 zeichen lang. ab stelle 21 beginnt dann der vorname. übrige zeichen werden mit leerstellen aufgefüllt.

    soviel dazu

    um das ganze dynamisch zu gestalten, da immer wieder attribute hinzukommen oder entfernt werden, gibt es in der datenbank eine tabelle namens formularfeld, in der die attribute mit namen, start index und länge gespeichert sind.

    die benutzer erfassen nun also über die weboberfläche verträge. jeder vertrag kann über unterschiedliche attribute verfügen. dh ich habe eine tabelle vertrag, in der eine mitarbeiterID und eine vertragID gespeichert wird. außerdem habe ich eine tabelle VertragZUFormularfeld, indem die VertragsID, die FormularfeldID und der eingegebene Wert gespeichert wird. So ist jedem Vertrag ein Mitarbeiter und eine variable anzahl an Attributen wie name, vorname, ort usw zugeordnet.


    Nun das Problem:
    ich möchte jeden Vertrag innerhalb einer Zeile selektieren. Also mit X spalten, wobei X gleich die anzahl aller benutzen Attribute ist. zb:

    vertagid: 1 vorname: max nachname: mustermann ort:musterort

    hier meine beispielprozedur:
    1. ich erstelle zunächst eine temporäre tabelle mit den spalten vertragid mitarbeiterid und sonstigen uninteressanten werten
    2.in einer schleife selektiere ich alle verträge
    3.innerhalb dieser schleife selektiere ich alle attribute
    4.falls das selektierte attribut noch nicht in der temporären vorhanden ist, wird es hinzugefügt.
    5.der wert des attributes wird anhand der vertragsid selektiert und in der temporären tabelle gespeichert
    6.attributen schleife beenden
    7. vertragsschleife beenden

    hier mal der code für die, die meine merkwürdige ausdrucksweise nicht verstehen:

    ALTER PROCEDURE [dbo].[get_Exports_neu]
    AS
    BEGIN
    	SET NOCOUNT ON;
    
    		DECLARE @Wert as nvarchar(255)
    		DECLARE @Wert2 as nvarchar(255)
    		DECLARE @Wert3 as nvarchar(255)
    		DECLARE @Wert4 as nvarchar(255)
    		DECLARE @Wert5 as nvarchar(255)
    		
    
    		DECLARE @SQL as nvarchar(MAX)
    		SELECT @SQL = 'CREATE TABLE ##tempVerträge([ID] [int] IDENTITY(1,1) NOT NULL,[Vertrag_ID] [int] NOT NULL,[Mitarbeiter] nvarchar(MAX) not null,[Mitarbeiter_ID] [int],[Papierform liegt vor] [bit])'
    		EXEC (@SQL)
    
    		DECLARE C_Vertrag CURSOR FOR
    			SELECT     dbo.Vertrag.Vertrag_ID, dbo.Mitarbeiter.Benutzername,dbo.Mitarbeiter.Mitarbeiter_ID,dbo.Vertrag.Papierform
    			FROM       dbo.Vertrag INNER JOIN
    					   dbo.Mitarbeiter ON dbo.Vertrag.Mitarbeiter_ID = dbo.Mitarbeiter.Mitarbeiter_ID
    			WHERE export = 1 
    			GROUP BY dbo.Vertrag.Vertrag_ID, dbo.Mitarbeiter.Benutzername,dbo.Mitarbeiter.Mitarbeiter_ID,dbo.Vertrag.Papierform
    			ORDER BY dbo.Vertrag.Vertrag_ID
    		OPEN C_Vertrag ;
    		
    		FETCH NEXT FROM C_Vertrag  into @Wert,@Wert2,@Wert3,@Wert4
    		WHILE @@FETCH_STATUS = 0
    		BEGIN
    			INSERT INTO ##tempVerträge (Vertrag_ID,Mitarbeiter,Mitarbeiter_ID,[Papierform liegt vor]) VALUES (@Wert,@Wert2,@Wert3,@Wert4)
    
    				DECLARE C_Werte CURSOR FOR
    					SELECT     Bezeichnung
    					FROM         dbo.Formularfeld
    					JOIN Formularfeld_zu_Vertrag on Formularfeld_zu_Vertrag.Vertrag_ID = @Wert
    					GROUP BY Bezeichnung
    					ORDER BY Bezeichnung
    				OPEN C_Werte;
    				
    				FETCH NEXT FROM C_Werte into @Wert5
    				WHILE @@FETCH_STATUS = 0
    				BEGIN	
    					if NOT EXISTS(select * from tempdb.sys.columns where object_id =
    					object_id('tempdb..##tempVerträge') and name = @Wert5)
    					BEGIN
    						SELECT @SQL = 'ALTER TABLE ##tempVerträge ADD ['+@Wert5+'] nvarchar(MAX)'
    						EXEC (@SQL)
    					END
    
    					SELECT @SQL = 'UPDATE ##tempVerträge SET [' +@Wert5+'] = (SELECT     TOP(1) dbo.Formularfeld_zu_Vertrag.Wert
    							FROM         dbo.Formularfeld_zu_Vertrag INNER JOIN
    												  dbo.Formularfeld ON dbo.Formularfeld_zu_Vertrag.Formularfeld_ID = dbo.Formularfeld.Formularfeld_ID WHERE Vertrag_ID='+@Wert+' AND Bezeichnung ='''+@Wert5+''') WHERE Vertrag_ID='+@Wert
    					EXEC (@SQL)
    					FETCH NEXT FROM C_Werte into @Wert5
    				END
    				CLOSE C_Werte
    				DEALLOCATE C_Werte
    
    			FETCH NEXT FROM C_Vertrag  into @Wert,@Wert2,@Wert3,@Wert4
    	END
    
    	CLOSE C_Vertrag 
    	DEALLOCATE C_Vertrag 
    	
    	SELECT * FROM ##tempVerträge
    	DROP TABLE ##tempVerträge
    END



    das ganze ist leider sehr sehr langsam, da ich für 20 verträge ca. 700 selektionen mache oO
    ich würde mich also über eine performantere version freuen
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!