Announcement

Collapse
No announcement yet.

Variable in einer SELECT Abfrage

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

  • Variable in einer SELECT Abfrage

    Hallo,

    Ich habe mir einen Cursor Programmiert, der mir die Namen von Meinen Robotern ausgbit.

    Roboter1
    Roboter2
    Roboter3

    Nun möchte ich einen Cursor Programmieren, der in den Einzelnen Robotern die Tabellen durchsucht.

    Mein Problem ist dabei, dass ich mit der Variable, die im Cursor steht leider keine SQL Abfrage stellen kann.

    Also:

    Roboter1 steht in der Variable @robotername

    Dann funktioniert die Selectabfrage nicht, die ich Programmiert habe.

    SELECT * FROM [@robotername].[dbo].[tabelle]

    kann mir jemand sagen, ob das geht?

    mfg

    Seby

  • #2
    Hallo Seby,

    nennt sich "dynamisches SQL" und dazu gibt es zuhauf Einträge in diesem Forum.

    Beispiel für Dich:

    DECLARE @SQL nvarchar(4000);
    SET @SQL = 'SELECT * FROM [' + @robotername + '].[dbo].[tabelle]';
    exec sp_execute @SQL;
    Olaf Helper

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

    Comment


    • #3
      Hallo,

      Der Dynamische SQL-Befehl funktioniert.

      Wo ich jetzt ein Problem habe ist, dass ich diese SQL-Befehl in einen 2ten Cursor einbauen will.
      Leider geht dies nicht. Er sagt mir, ich habe einen Syntax Fehler im rotenm Bereich

      Code:
      DECLARE @diff AS INT
      DECLARE @skriptname AS VARCHAR(MAX)
      DECLARE @robotername AS VARCHAR(MAX)
      DECLARE @robotername1 AS VARCHAR(MAX)
      DECLARE @SQL AS NVARCHAR(MAX)
      DECLARE @SQL_skriptname AS NVARCHAR(MAX)
      
      
      DECLARE robotername_cursor CURSOR LOCAL STATIC
      	FOR SELECT robotername FROM [qos-roboter].[dbo].[tblRoboter]
      		WHERE InAuswertung = 1 or InAuswertungREG = 1
      
      OPEN robotername_cursor
      FETCH NEXT FROM robotername_cursor INTO @robotername
      WHILE @@fetch_status = 0
      BEGIN
      
      	SET @SQL_skriptname = 'SELECT skript FROM [' + @robotername + '].[dbo].[tblSchwellwerte]'
      
      	PRINT @SQL
      	PRINT @SQL_skriptname
      	
      	DECLARE skript_cursor CURSOR LOCAL STATIC
      		FOR EXEC SP_EXECUTESQL @SQL_skriptname
      	
      
      	OPEN skript_cursor
      	FETCH NEXT FROM skript_cursor INTO @skriptname
      	WHILE @@fetch_status = 0
      	BEGIN		
      		PRINT @skriptname	
      		FETCH NEXT FROM skript_cursor INTO @skriptname
      	END
      
      	
      	FETCH NEXT FROM robotername_cursor INTO @robotername
      	DEALLOCATE skript_cursor
      
      END
      
      DEALLOCATE robotername_cursor
      Zuletzt editiert von Seby-Deluxe; 23.04.2008, 10:17.

      Comment


      • #4
        Hallo Seby,

        so geht es auch nicht, da muss Du einen Umweg über eine temporäre Tabelle nehmen.

        Konnte ich zwar jetzt nicht test, aber probier es mal hiermit
        [highlight=SQL]DECLARE @diff AS INT
        DECLARE @skriptname AS sysname
        DECLARE @robotername AS sysname
        DECLARE @robotername1 AS sysname
        DECLARE @SQL AS NVARCHAR(4000)
        DECLARE @SQL_skriptname AS NVARCHAR(4000)

        DECLARE robotername_cursor CURSOR LOCAL STATIC
        FOR SELECT robotername FROM [qos-roboter].[dbo].[tblRoboter]
        WHERE InAuswertung = 1 or InAuswertungREG = 1

        OPEN robotername_cursor
        FETCH NEXT FROM robotername_cursor INTO @robotername
        WHILE @@fetch_status = 0
        BEGIN
        SET @SQL = 'INSERT INTO #Skript (Skriptname) ' +
        'SELECT skript FROM [' + @robotername + '].[dbo].[tblSchwellwerte]'

        CREATE TABLE #Skript
        (Skriptname varchar(100) NOT NULL)
        --Temp Tabelle füllen
        EXEC sp_executesql @sql
        DECLARE skript_cursor CURSOR LOCAL STATIC
        FOR SELECT Skriptname FROM #Skript

        OPEN skript_cursor
        FETCH NEXT FROM skript_cursor INTO @skriptname
        WHILE @@fetch_status = 0
        BEGIN
        PRINT @skriptname
        FETCH NEXT FROM skript_cursor INTO @skriptname
        END
        DEALLOCATE skript_cursor
        DROP TABLE #Skript

        FETCH NEXT FROM robotername_cursor INTO @robotername

        DEALLOCATE robotername_cursor
        END [/highlight]

        P.S. Du gehst aber großzügig mit varchar(max) um. Ist zwar egal, aber SYSNAME für die Tabellennamen würde schon reichen; länger können die nicht werden.
        Olaf Helper

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

        Comment


        • #5
          Hallo O.Helper,

          Nachdem das mit dem Curser im Cursor und Dynamische SQL nicht Funktioniert hat, habe ich mir auch eine Virtuelle Tabelle erzeugt.

          Vielen Dank es geht nun.

          mfg

          Seby

          Comment

          Working...
          X