Dynamic T-SQL stored procedure to insert in differents tables

后端 未结 3 635
终归单人心
终归单人心 2021-01-27 16:20

What is the best way to achieve this

INSERT INTO @TableName (@ColumnNames)
    EXEC sp_executesql @SQLResult;

Where @TableName,

相关标签:
3条回答
  • 2021-01-27 16:47

    Use EXECUTE sp_executesql @sql, here is example:

    create proc sp_DynamicExcuteStore 
    @TableName varchar(50),
    @ColumnNames varchar(50),
    @SQLResult varchar(max)
    as
    declare @sql nvarchar(max) = '
    INSERT INTO '+@TableName+' ('+@ColumnNames+')
        EXEC sp_executesql '+@SQLResult
    EXECUTE sp_executesql @sql
    go
    create proc sp_test
    as
    select 'test' + convert(varchar,RAND())
    go
    CREATE TABLE [dbo].[Test](
        [text1] [nvarchar](500) NULL
    ) ON [PRIMARY]
    
    GO
    DECLARE @return_value int
    
    EXEC    @return_value = [dbo].[sp_DynamicExcuteStore]
            @TableName = N'Test',
            @ColumnNames = N'text1',
            @SQLResult = N'proc_test'
    
    SELECT  'Return Value' = @return_value
    
    GO
    
    SELECT TOP 1000 [text1]
      FROM [test].[dbo].[Test]
    
    0 讨论(0)
  • 2021-01-27 16:57

    The best way is to write (or generate) all reqiured procedures for all table. 23 tables times 4 procedures (insert, update, delete and select) that can be generated automatically is nothing in dev time and pain compared to the so called "generic solution".

    It's a path to poor perfomance, unreadable code, sql injection hazard and countless debuging hours.

    0 讨论(0)
  • 2021-01-27 17:04

    First of all I appreciate all your comments. And I agree that SQL dynamic is a pain to debug (Thanks God, management studio has this possibility). And, of course there are hundreds of different solutions

    I solved it in this way finally, more or less I try to explain why this solution of SQL dynamic. The client uses xlsx spreadsheets to enter certain data, so I read the spreadsheets and I insert the (data depends on the spreadsheet to insert into the proper table). Later the data in the tables are exported to XML to send a third party sofware.

    SET @SEL = N'';
    DECLARE sel_cursor CURSOR
    FOR (SELECT  sc.name as field
          FROM sys.objects so INNER JOIN sys.columns sc ON so.[object_id]=sc.[object_id]
          WHERE so.name= @TableName and sc.name not in ('InitDate', 'EndDate', 'Version', 'Status'));
    
    SET @SEL = ''; set @i = 0;
    OPEN sel_cursor
    FETCH NEXT FROM sel_cursor INTO @field
    WHILE @@FETCH_STATUS = 0
    BEGIN
        set @sel = @sel + ', '+ @field 
        set @i   = 1;
        FETCH NEXT FROM sel_cursor INTO @field
    END
    CLOSE sel_cursor;
    DEALLOCATE sel_cursor;
    
    
    SET @SQL = N''
    SET @SQL = @SQL + N'SELECT * INTO XLImport FROM OPENROWSET'
    SET @SQL = @SQL + N'('
    SET @SQL = @SQL + N'''Microsoft.ACE.OLEDB.12.0'''+','
    SET @SQL = @SQL + N'''Excel 12.0 Xml; HDR=YES;'
    SET @SQL = @SQL + N'Database='+@file +''''+ ','
    SET @SQL = @SQL + N'''select * from ['+ @SheetName + '$]'''+');'
    
    EXEC sp_executesql @SQL
    
    SET @SQL = N'';
    SET @SQL = @SQL + N'
    SELECT '+''''+CAST(@initDate AS VARCHAR(10))+'''' +', '+ ''''+CAST(@endDate AS VARCHAR(10))+'''' 
          + ', '+ CAST(@version AS VARCHAR(2)) +', ' +''''+@status+''''
          + @SEL 
     +'    FROM DBO.XLImport '
    
    
    DECLARE cols_cursor CURSOR
       FOR (Select COLUMN_NAME From INFORMATION_SCHEMA.COLUMNS where table_name = @tableName);
    SET @SEL = ''; set @i = 0;
    OPEN cols_cursor
    FETCH NEXT FROM cols_cursor INTO @field
    WHILE @@FETCH_STATUS = 0
    BEGIN
       set @sel = @sel + @field + ', '
       set @i   = 1;
       FETCH NEXT FROM cols_cursor INTO @field
    END
    CLOSE cols_cursor;
    DEALLOCATE cols_cursor;
    
    SET @SEL = LEFT(@SEL, LEN(@SEL) - 1) -- remove last ,
    
    
    SET @SQL = N''
    SET @SQL = @SQL + N'SELECT * INTO XLImport FROM OPENROWSET'
    SET @SQL = @SQL + N'('
    SET @SQL = @SQL + N'''Microsoft.ACE.OLEDB.12.0'''+','
    SET @SQL = @SQL + N'''Excel 12.0 Xml; HDR=YES;'
    SET @SQL = @SQL + N'Database='+@file +''''+ ','
    SET @SQL = @SQL + N'''select * from ['+ @SheetName + '$]'''+');'
    
    EXEC sp_executesql @SQL
    
    SET @SQLString =
    N'INSERT INTO '+ @TableName + '('+ @SEL +') ' + @SQL;
    
    EXEC sp_executesql @SQLString
    
    0 讨论(0)
提交回复
热议问题