Sql Select-Query mit dynamischer Text-Variable

Beantwortet Sql Select-Query mit dynamischer Text-Variable

  • Freitag, 27. April 2012 07:20
     
      Enthält Code

    Hi,

    ich sitz hier an einem Problem und bin erstaunt, dass es nicht funktioniert:

    declare @pNumberOfRecords int;
    declare @pRequestStatement varchar(200);
    declare @pYearKW varchar(6);
    
    set @pNumberOfRecords = 5;
    set @pRequestStatement =',ow.[AnzObjCall] as [Count] ';
    set @pYearKW = 201125;
    
    	
    	SELECT TOP (@pNumberOfRecords)
    	oa.[ObjID],
    	@pRequestStatement
    	FROM [immo].[OAListe] oa WITH (NOLOCK)
    	INNER JOIN Statistic.Relation_UID_ObjGuid uidoid ON uidoid.[ObjGuid] = oa.[DcGuid]
    	INNER JOIN Statistic.Objects_Week ow ON ow.UniqueObjID = uidoid.UniqueObjID
    	WHERE ow.yearkw = @pYearKW
    	ORDER BY oa.[Plz] DESC, oa.[Ort]	;

    Weiß jemand Rat wie ich @pRequestStatement in das Select-Statement einbinden kann und mir die Ausführung nicht den Text zurückgibt den ich da anfüge, sondern die Anzahl in Spalte Count?

    Danke! :)


Alle Antworten

  • Freitag, 27. April 2012 07:33
    Moderator
     
     Beantwortet Enthält Code

    Du begibst dich hier die Untiefen des Dynamischen SQL. Liese hierzu bitte vorher Erlands Artikel darüber.

    Ich hoffe du weißt um die Problematik von WITH ( NOLOCK ) im speziellen mit COUNT().

    Warum ist @YearKW ein VARCHAR(6)? Aus Sortierungsgründen sollte die erste KW 201101 sein. Damit wäre die Anzahl der Stellen immer gleich. Auch könnte man es so als INT speichern.

    Ansonsten:

    DECLARE @pNumberOfRecords INT = 5;
    DECLARE @pRequestStatement VARCHAR(200) = ',ow.[AnzObjCall] as [Count] ';
    DECLARE @pYearKW VARCHAR(6) = 201125;
    
    DECLARE @Sql NVARCHAR(MAX) = '	
    SELECT TOP ( @pNumberOfRecords )
            oa.[ObjID] , ' + @pRequestStatement + '
    FROM    [immo].[OAListe] oa WITH ( NOLOCK )
            INNER JOIN Statistic.Relation_UID_ObjGuid uidoid ON uidoid.[ObjGuid] = oa.[DcGuid]
            INNER JOIN Statistic.Objects_Week ow ON ow.UniqueObjID = uidoid.UniqueObjID
    WHERE   ow.yearkw = @pYearKW
    ORDER BY oa.[Plz] DESC ,
            oa.[Ort];
    ';
    
    EXEC sp_executesql @Sql, N'@pNumberOfRecords INT, @pYearKW VARCHAR(6)', @pNumberOfRecords, @pYearKW;


  • Freitag, 27. April 2012 07:54
     
     Beantwortet Enthält Code

    ich sitz hier an einem Problem und bin erstaunt, dass es nicht funktioniert

    Hallo,

    und ich bin nicht erstaunt; wenn Du mit dynamischem SQL arbeiten willst, musst Du es auch ganz als dynamisches SQL umsetzten; hier als vereinfachtes Beispiel:

    declare @pRequestStatement varchar(200);
    set @pRequestStatement =',ow.[object_id] as [Count] ';
    
    DECLARE @sql nvarchar(1000);
    
    SET @sql = 	
    N'SELECT ow.name ' + @pRequestStatement +
    N' FROM sys.tables AS ow';
    
    EXEC sp_executesql @sql


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

  • Donnerstag, 10. Mai 2012 14:29
    Besitzer
     
     

    Hallo PowerMogli,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.