none
Sql Select-Query mit dynamischer Text-Variable RRS feed

  • Frage

  • 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! :)


    Freitag, 27. April 2012 07:20

Antworten

  • 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:33
    Moderator
  • 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

    Freitag, 27. April 2012 07:54

Alle Antworten

  • 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:33
    Moderator
  • 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

    Freitag, 27. April 2012 07:54
  • 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.

    Donnerstag, 10. Mai 2012 14:29
    Moderator