Создание динамической таблицы T-SQL - PullRequest
2 голосов
/ 05 мая 2011

Так что это своего рода продолжение моего последнего вопроса

У меня есть строка, которая выглядит следующим образом:

Acc_id,Field label,Data point

Я хотел бы создать таблицу из приведенной выше строки, используя что-то вроде

CREATE TABLE #temp
    (Acc_id         NVARCHAR(MAX), 
     Field label    REAL,
     Data point     REAL) 

Запятые разделяют столбцы - они должны быть динамическими, поэтому, если появляется больше столбцов, они создаются в таблице.

UPDATE: это то, что у меня пока далеко от сети, но мне нужно сделать первый столбец NVARCHAR, а остальные реальными, а не наоборот.

  declare @path NVARCHAR(MAX)
    SET @path = 'c:\temp\Book2.txt'

        declare @execSQL nvarchar(1000)
        declare @tempstr varchar(1000)
        declare @col varchar(1000)
        declare @table nvarchar(1000)

        -- Create a temp table to with one column to hold the first row of the csv file



          CREATE TABLE #tbl (line VARCHAR(1000))
           SET @execSQL = 
                'BULK INSERT #tbl  
                FROM ''' + @path + '''  
                WITH (  
                         FIELDTERMINATOR ='','',
                         FIRSTROW = 1,  
                         ROWTERMINATOR = ''\n'',
                         LASTROW = 1 
                      )         
               ' 

           EXEC sp_executesql @stmt=@execSQL 

        update #tbl set line = REPLACE(line,' ','_') where line like '% %'


           SET @col = ''
           SET @tempstr = (SELECT TOP 1 RTRIM(REPLACE(Line, CHAR(9), ',')) FROM #tbl)
           DROP TABLE #tbl
           WHILE CHARINDEX(',',@tempstr) > 0
            BEGIN           

               SET @col=@col + LTRIM(RTRIM(SUBSTRING(@tempstr, 1, CHARINDEX(',',@tempstr)-1))) + ' varchar(100),'     

               SET @tempstr = SUBSTRING(@tempstr, CHARINDEX(',',@tempstr)+1, len(@tempstr)) 
            END
            SET @col = @col + @tempstr + ' real'

           IF Object_id('tempdb..##temptable') IS NOT NULL 
           DROP TABLE #temptable 

           SET @table = 'create table ##temptable (' + @col + ')'

           EXEC sp_executesql @stmt=@table


        -- Load data from csv
           SET @execSQL = 
                'BULK INSERT ##temptable
                FROM ''' + @path + '''  
                WITH (  
                         FIELDTERMINATOR ='','',
                         FIRSTROW = 2,  
                         ROWTERMINATOR = ''\n''              
                      )         
               '  

           EXEC sp_executesql @stmt=@execSQL 

Спасибо Rob

Ответы [ 2 ]

2 голосов
/ 06 мая 2011

Следующее прекрасно работает для того, что я хочу сделать

declare @path NVARCHAR(MAX)

SET @path = 'c:\temp\Book2.txt'

    declare @execSQL nvarchar(1000)
    declare @tempstr varchar(1000)
    declare @col varchar(1000)
    declare @table nvarchar(1000)

    -- Create a temp table to with one column to hold the first row of the csv file

  IF Object_id('tempdb..#tbl') IS NOT NULL 
       DROP TABLE #tbl 

      CREATE TABLE #tbl (line VARCHAR(1000))
       SET @execSQL = 
            'BULK INSERT #tbl  
            FROM ''' + @path + '''  
            WITH (  
                     FIELDTERMINATOR ='','',
                     FIRSTROW = 1,  
                     ROWTERMINATOR = ''\n'',
                     LASTROW = 1 
                  )         
           ' 

       EXEC sp_executesql @stmt=@execSQL 

    update #tbl set line = REPLACE(line,' ','_') where line like '% %'


       SET @col = ''
       SET @tempstr = (SELECT TOP 1 RTRIM(REPLACE(Line, CHAR(9), ',')) FROM #tbl)

       DROP TABLE #tbl

    SET @col=@col + LTRIM(RTRIM(SUBSTRING(@tempstr, 1, CHARINDEX(',',@tempstr)-1))) + ' nvarchar(max),'     
    SET @tempstr = SUBSTRING(@tempstr, CHARINDEX(',',@tempstr)+1, len(@tempstr))

       WHILE CHARINDEX(',',@tempstr) > 0
        BEGIN           

           SET @col=@col + LTRIM(RTRIM(SUBSTRING(@tempstr, 1, CHARINDEX(',',@tempstr)-1))) + ' nvarchar(max),'     

           SET @tempstr = SUBSTRING(@tempstr, CHARINDEX(',',@tempstr)+1, len(@tempstr)) 
        END
        SET @col = @col + @tempstr + ' real'


       IF Object_id('tempdb..##temptable') IS NOT NULL 
       DROP TABLE ##temptable 

       SET @table = 'create table ##temptable (' + @col + ')'

       EXEC sp_executesql @stmt=@table


    -- Load data from csv
       SET @execSQL = 
            'BULK INSERT ##temptable
            FROM ''' + @path + '''  
            WITH (  
                     FIELDTERMINATOR ='','',
                     FIRSTROW = 2,  
                     ROWTERMINATOR = ''\n''              
                  )         
           '  

       EXEC sp_executesql @stmt=@execSQL 

select * from ##temptable
0 голосов
/ 05 мая 2011

Я бы предложил сделать цикл while и объединить строку для создания вашей таблицы. Это может быть полезно для анализа через разделенные разделителями списки. Что-то похожее на приведенное ниже должно помочь вам начать.

set @IDList='Field1,Field2,Field3,'
set @i=1
set @pos =  patindex('%,%' , @IDList)
while @pos <> 0 begin
    -- Loop through Elements
    set @CurrentID= isnull(left(@IDList, @pos-1),null)

    set @SQLConstructor=@SQLConstructor+',sum('+@CurrentID+') as Column'+@si

    --- Reset loop
    set @IDList = stuff(@IDList, 1, @pos, '')
    set @pos =  patindex('%,%' , @IDList)
    set @i=@i+1
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...