Announcement

Collapse
No announcement yet.

INSERT EXEC in Funktion

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • INSERT EXEC in Funktion

    Liebe Community.

    Ich habe eine StoredProcedure, die liefert mir Werte aus der AD über OpenQuery. Da der OpenQuery selbst keine Variablen halten darf, baue ich diesen in einem String auf, und führe ihn als EXEC aus. Die Rechnernamen beziehe ich aus einer Table.

    Nun brauche ich jedoch eine Funktion, mit welcher ich diese Daten in eine Table bekomme.

    Code:
    CREATE FUNCTION getADTime
    (
    @ComputerCN nvarchar(10)
    )
    RETURNS datetime
    AS
    BEGIN
    	-- Declare the return variable here
    	DECLARE @tmpExecResult TABLE (LastLogon bigint, Lastlogontimestamp bigint, WhenCreated datetime)
    	DECLARE @R datetime
    	INSERT  @tmpExecResult EXEC dbo.sp_GetADInformation @ComputerCN, 'LastLogon,Lastlogontimestamp,Whencreated'
    	SELECT @R = MAX(Logon) FROM (
    		SELECT dbo._ConvertInt8todatetime(LastLogon) AS Logon FROM @tmpExecResult 
    		UNION
    		SELECT dbo._ConvertInt8todatetime(Lastlogontimestamp) AS Logon FROM @tmpExecResult 
    		UNION
    		SELECT WhenCreated AS Logon FROM @tmpExecResult
    		)
    	RETURN @R
    END
    GO
    Das Insert mag SQL nicht durchführen.

    Der Versuch mit Create TABLE #tmpExecResult hat auch nicht gefruchtet.

    Gibt es innerhalb einer fkt die möglichkeit einen String zu executen, und das result an eine Table zu übergeben?

  • #2
    Hi

    1.) Dein UNION verbindet verschiedene Datentypen
    2.) Kann sein, dass mit deiner sp_GetADInformation was nicht stimmt? Hat den Anschein, dass die Parameter falsch angeordnet sind bzw. nicht separiert wurden?
    3.) Dein Ergebnis soll datetime sein, jedoch ist LastLogon ein bigint

    Naja, denke da kann man schon noch einiges "sauberer" machen.

    Gruß
    Norbert
    Beste Grüße
    Norbert

    _Code * It * Simple * and * Smile_

    Access: FAQAccess-Funktionen
    SQL: sqlfaq ° sqlservercentral ° databasejournal ° insideSQL
    C#: snippets ° C# Corner ° codeproject ° Free ebook ° Pflichtlektüre
    Was nützt die beste Informationstechnik, wenn sich die Menschen nichts zu sagen haben?”

    Comment


    • #3
      Zu 1.

      LastLogon und LastLogonTimeStamp kommen als BigInt zurück. Deswegen laufen die auch noch durch eine Convert Function.

      Zu 2.

      Die StoredProcedure baut den LDAP String zusammen und baut dann einen String mit OpenQuery. Dieser wird dann mit Exec ausgeführt, und zurück gegeben.
      Mein Problem ist, daß ich diesen Exec nicht in der Funktion an ein Table übergeben bekomme.
      Führe ich die sp händisch aus, liefert diese vernünftige Werte.

      Zu 3. siehe 1.

      Comment


      • #4
        Hallo,
        Originally posted by Lifeguard View Post
        Gibt es innerhalb einer fkt die möglichkeit einen String zu executen, und das result an eine Table zu übergeben?
        Nein, man kann keine Prozeduren aus einer Funktion aufrufen!
        Versuch die Funktion einfach in eine Prozedur umzuändern.

        lg chapster

        Comment


        • #5
          hallo,
          hatten ähnliche Probleme, wir mussten die Einzelteile des Statements mit mehreren Variablen zusammen setzen und haben die Daten in eine Tabelle gespeichert.

          also in etwa so
          SET @dummy = 'INSERT INTO tbl_daten (feld1, feld2,.......) '
          .
          .
          .
          set @dummy = @dummy + ' FROM OPENQUERY(ADSI, '
          set @dummy = @dummy + ' ''SELECT ADsPath , cn, objectguid FROM ''''' +[dbo].getconfig_byID(1)+
          dbo.getconfig_byID(2) + dbo.getconfig_byID(4)+ ''''''
          set @dummy = @dummy + ' WHERE Member='''''+ @distinguishedName +''''' and objectClass = ''''group'''' order by name'') AS Daten '

          exec (@dummy)



          Man beachte die vielen Hochkommas damit der zusammengesetzte SQL-String am Ende passt.

          Comment

          Working...
          X