Announcement

Collapse
No announcement yet.

Stored Procedure zur Erzeugung von INSERT-INTO-Scripten aus vorhandenen Daten

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

  • Stored Procedure zur Erzeugung von INSERT-INTO-Scripten aus vorhandenen Daten

    Hallo Forum,

    hat jemand eine Procedure zur Hand, mit welcher sich aus einem Datensatz innerhalb einer Tabelle ein INSERT-INTO-Script formen lässt?

    Etwa nach dem Schema

    aus Datensatz:

    IRGENDEINE_TABELLE:
    INT_FELD1,INT_FELD2,INT_FELD3,VARCHAR_FELD4
    1;2;3;'TEXT'

    wird INSERT-INTO-Script:

    Code:
    INSERT INTO IRGENDEINE_TABELLE(INT_FELD1,INT_FELD2,INT_FELD3,VARCHAR_FELD4)VALUES(1,2,3,'TEXT')
    Das wäre toll. Vielen Dank vorweg.

    Grüße

    "A fool with a tool is still a fool."

  • #2
    Originally posted by Freelancer View Post
    Hallo Forum,

    hat jemand eine Procedure zur Hand, mit welcher sich aus einem Datensatz innerhalb einer Tabelle ein INSERT-INTO-Script formen lässt?

    Etwa nach dem Schema

    aus Datensatz:

    IRGENDEINE_TABELLE:
    INT_FELD1,INT_FELD2,INT_FELD3,VARCHAR_FELD4
    1;2;3;'TEXT'

    wird INSERT-INTO-Script:

    Code:
    INSERT INTO IRGENDEINE_TABELLE(INT_FELD1,INT_FELD2,INT_FELD3,VARCHAR_FELD4)VALUES(1,2,3,'TEXT')
    Das wäre toll. Vielen Dank vorweg.

    Grüße
    Jetzt war ich zu voreilig. Ein befreundeter Entwickler hatte was in SQL Server-Syntax in petto, und war so nett, es mir zukommen zu lassen:

    Code:
    
    /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    AUTHOR KARTHIK
    DESCRIPTION BUILDS THE INSERT QUERY FOR ANY GIVEN TABLE
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
    CREATE PROCEDURE SP_GEN_INSERT_SQL
    @TABLENAME VARCHAR ( 2000 )
    AS
    BEGIN
    
    DECLARE CUR_METADATA CURSOR FOR
    SELECT NAME , XTYPE
     FROM SYSCOLUMNS
    WHERE ID IN ( SELECT ID FROM SYSOBJECTS WHERE NAME = @TABLENAME )
    /* DECLARE VARIABLES*/
    DECLARE @QRY1 VARCHAR (8000 ) /* Has column names */
    DECLARE @QRY2 VARCHAR ( 8000 ) /* Has column values */
    
    DECLARE @COLNAME VARCHAR ( 8000)
    DECLARE @COLDATATYPE TINYINT
    DECLARE @PRVCOLDATATYPE TINYINT
    
    DECLARE @CHARPREFIX VARCHAR ( 5 )
    DECLARE @CHARPOSTFIX VARCHAR ( 5 )
    DECLARE @COLUMNSEPARATOR CHAR ( 1 )
    DECLARE @NULLCHAR CHAR ( 4 )
    
    SET @CHARPREFIX = ''''
    SET @CHARPOSTFIX = ''''
    SET @COLUMNSEPARATOR = ','
    SET @NULLCHAR = 'NULL'
    
    /* Start building the query */
    SET @QRY1 = "SELECT 'INSERT INTO " + @TABLENAME + "(" --+ " VALUES ( "
    
    SET @QRY2 = ''
    
    OPEN CUR_METADATA
    
    FETCH NEXT FROM CUR_METADATA INTO @COLNAME , @COLDATATYPE
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    /* Add the Column names to the query */
    SET @QRY1 = @QRY1 + @COLNAME + ','
    
    /* Add Column values - Prefix & postfix the column values with quotes if  
    they belong to any of the following datatypes */
    /* TEXT - 35 | SMALLDATETIME - 58 | DATETIME - 61 | NTEXT - 99 | VARCHAR -  
    167 | CHAR - 175 | NVARCHAR - 231 | NCHAR - 239 */
    IF ( @COLDATATYPE = 35 ) OR ( @COLDATATYPE = 58 ) OR ( @COLDATATYPE = 61 )  
    OR ( @COLDATATYPE = 99 ) OR
    ( @COLDATATYPE = 167 ) OR ( @COLDATATYPE = 175 ) OR ( @COLDATATYPE = 231 )  
    OR ( @COLDATATYPE = 239 )
    BEGIN
    IF @QRY2 = ''
    BEGIN
    SET @QRY2 = @QRY2 + @CHARPREFIX + @CHARPREFIX + @CHARPREFIX +  
    '+ISNULL(CAST(' + @COLNAME + ' AS VARCHAR),' + "'NULL'" + ')' --+ "'')"
    END
    ELSE
    BEGIN
    SET @QRY2 = @QRY2 + @CHARPREFIX + @CHARPREFIX + @CHARPREFIX +  
    '+ISNULL(CAST(' + @COLNAME + ' AS VARCHAR),' + "'NULL'" + ')' --+ "'')"
    END
    SET @QRY2 = @QRY2 + '+' + @CHARPOSTFIX + @CHARPOSTFIX + @CHARPOSTFIX +  
    @COLUMNSEPARATOR
    END
    ELSE /*If the column is a number dont prefix/postfix quotes */
    BEGIN
    SET @QRY2 = @QRY2 + '''' + '+ISNULL(CAST(' + @COLNAME + ' AS VARCHAR),' +  
    "'NULL'" + ')'
    SET @QRY2 = @QRY2 + '+' + @CHARPOSTFIX + @COLUMNSEPARATOR
    END
    --PRINT @QRY2
    SET @PRVCOLDATATYPE = @COLDATATYPE
    FETCH NEXT FROM CUR_METADATA INTO @COLNAME , @COLDATATYPE
    END
    
    CLOSE CUR_METADATA
    DEALLOCATE CUR_METADATA
    
    SET @QRY1 = SUBSTRING ( @QRY1 , 1 , LEN ( @QRY1 ) - 1 )
    SET @QRY1 = @QRY1 + ')VALUES(' --+ "'" + "'" +"'"
    
    SET @QRY2 = SUBSTRING ( @QRY2 , 1 , LEN ( @QRY2 ) - 1 )
    SET @QRY2 = @QRY2 + ')' + @CHARPOSTFIX
    SET @QRY2 = @QRY2 + ' FROM ' + @TABLENAME
    
    /* Create a temporary table to hold the result of the query - i.e. it will  
    have the INSERT statements */
    CREATE TABLE #SQLTRACE ( SQL VARCHAR ( 8000 ) )
    --print @QRY1 + @QRY2
    SET @QRY2 = ' INSERT INTO #SQLTRACE ' + @QRY1 + @QRY2
    IF LEN ( @QRY2 ) < 8000
    BEGIN
    SET NOCOUNT ON
    --PRINT @QRY2
    EXEC ( @QRY2 )
    --PRINT ' INSERT INTO #SQLTRACE ' + @QRY1 + @QRY2
    --EXEC ( ' INSERT INTO #SQLTRACE ' + @QRY1 + @QRY2 )
    UPDATE #SQLTRACE SET SQL = REPLACE ( SQL , "'NULL'" , @NULLCHAR )
    SELECT * FROM #SQLTRACE
    END
    ELSE
    BEGIN
    PRINT 'UNABLE TO GENERATE INSERT STATEMENTS FOR TABLE :' +@TABLENAME
    END
    SET NOCOUNT OFF
    END /* END OF FILE */
    GO
    Vielleicht kann es hier ja mal jemand brauchen- will ja im Zweifel nicht nur Fragen stellen, sondern bei erzielten Lösungen diese auch zur Verfügung stellen....

    Grüße

    "A fool with a tool is still a fool."

    Comment


    • #3
      Oder man nimmt gleich SSMS 2008, das kann das von Haus aus. (vor 2008: Database Publishing Wizard).
      Da kann man sich zumindest halbwegs sicher sein, das alle Datentypen richtig berücksichtigt werden.

      Denn bei dem Zweig für CHAR Wert steht
      "'NULL'"
      Wenn man NULL in Hochkomma setzt, wird da wieder ein Text-Wert raus; kein NULL.
      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


      • #4
        Originally posted by O. Helper View Post
        Oder man nimmt gleich SSMS 2008, das kann das von Haus aus. (vor 2008: Database Publishing Wizard).
        Da kann man sich zumindest halbwegs sicher sein, das alle Datentypen richtig berücksichtigt werden.

        Denn bei dem Zweig für CHAR Wert steht
        "'NULL'"
        Wenn man NULL in Hochkomma setzt, wird da wieder ein Text-Wert raus; kein NULL.
        Wow, SQL Server 2008 kann das von Haus aus?
        Wie muss ich vorgehen? Kannste mir das kurz schildern? Also bei einer Tabelle ein INSERT-INTO-Script zu erstellen wäre ja einfach- bringt jedoch nicht den gewünschten Effekt wie im ersten Post beschrieben...

        Vielen Dank vorweg und Grüße

        "A fool with a tool is still a fool."

        Comment


        • #5
          Originally posted by Freelancer View Post
          Wow, SQL Server 2008 kann das von Haus aus?
          Wie muss ich vorgehen? Kannste mir das kurz schildern? Also bei einer Tabelle ein INSERT-INTO-Script zu erstellen wäre ja einfach- bringt jedoch nicht den gewünschten Effekt wie im ersten Post beschrieben...

          Vielen Dank vorweg und Grüße
          Habs herausgefunden: Das ist der Skriptassistent, wenn man per Rechtsklick auf eine Datenbank klickt.... klar! Vielen Dank nochmals !!!

          Im Anhang das Fenster... :-)
          Attached Files

          "A fool with a tool is still a fool."

          Comment

          Working...
          X