Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да вмъкнете групово с динамична стойност за колона

Това е един от малкото случаи, когато курсорът всъщност е идеален в SQL Server. Ето един начин. След като видите оператора PRINT и сте доволни, можете да го коментирате и да премахнете коментарите от двата реда под него. Вложих някаква логика, за да добавя името на файла и датата на обработка, което обикновено е необходимо, но дефиницията на вашата таблица ще се нуждае от тези колони. Трябва да предаде идеята.

---------------------------------------------------------------------------------------------------------------
--Set some variables
---------------------------------------------------------------------------------------------------------------

DECLARE @dt VARCHAR(10)                                                         --date variable but stored as VARCHAR for formatting of file name
DECLARE @fileLocation VARCHAR(128) = 'E:\DATA_TRANSFERS\'                       --production location which is \\issqlstd01 but the xp_dirtree didn't like this
DECLARE @sql NVARCHAR(4000)                                                     --dynamic sql variable
DECLARE @fileName VARCHAR(128)                                                  --full file name variable


---------------------------------------------------------------------------------------------------------------
--Get a list of all the file names in the directory
---------------------------------------------------------------------------------------------------------------

IF OBJECT_ID('tempdb..#FileNames') IS NOT NULL DROP TABLE #FileNames
CREATE TABLE #FileNames (
    id int IDENTITY(1,1)
    ,subdirectory nvarchar(512)
    ,depth int
    ,isfile bit)
INSERT #FileNames (subdirectory,depth,isfile)
EXEC xp_dirtree @fileLocation, 1, 1





---------------------------------------------------------------------------------------------------------------
--Create a cursor to fetch the file names
---------------------------------------------------------------------------------------------------------------

DECLARE c CURSOR FOR
select subdirectory from #FileNames where isfile = 1

OPEN c
FETCH NEXT FROM c INTO @fileName

---------------------------------------------------------------------------------------------------------------
--For each file, bulk insert 
---------------------------------------------------------------------------------------------------------------


WHILE @@FETCH_STATUS = 0
    BEGIN

        SET @sql = 'BULK INSERT Employee_Table FROM '''+ @fileLocation + @fileName +''' WITH (FIELDTERMINATOR = ''\t'',KEEPNULLS,ROWTERMINATOR = ''0x0a'')'


        --Try the bulk insert, if error is thrown log the error 
        --Also update the Table Columns which aren't a part of the original file (load date and original file name)
        BEGIN TRY
            PRINT(@sql)
            --EXEC(@sql)
            --UPDATE Employee_Table SET OrigFile = @fileName, LoadDate = GETDATE() WHERE OrigFile IS NULL
        END TRY
        BEGIN CATCH
            SELECT ERROR_MESSAGE()
        END CATCH

        FETCH NEXT FROM c INTO @fileName
    END

CLOSE c
DEALLOCATE c

GO



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка при промяна на типа на курсора в резултатите от функцията за добавяне на дата на Perl OLE32 MSSQL

  2. Използвайте FILEGROUP_ID(), за да върнете идентификатора на файлова група в SQL Server

  3. По-добри техники за изрязване на водещи нули в SQL Server?

  4. Как да изпълня MSSQL съхранена процедура с ADOdb PHP библиотека?

  5. SQL стандарти за форматиране