Вставка / форматирование в SQL [дубликат]

Если вы получаете эту ошибку с ответом native, это может быть связано с ссылкой на пакет NPM, который вы удалили (как это было в моем случае). После удаления ссылок на него в файлах settings.gradle и build.gradle я очищался и перестраивался, и он не хуже нового:)

5
задан pnuts 10 November 2015 в 02:07
поделиться

2 ответа

Вы можете добавить столбец FileName varchar(max) в таблицу ResultsDump, создать представление таблицы с новым столбцом, объемную вставку в представление и после каждой вставки указать имя файла для столбцов, где оно по-прежнему имеет значение по умолчанию null:

CREATE TABLE dbo.ResultsDump
(
    PC FLOAT,
    Amp VARCHAR(50),
    RCS VARCHAR(50),
    CW VARCHAR(50),
    State0 VARCHAR(50),
    State1 VARCHAR(50),
)
GO

ALTER TABLE dbo.ResultsDump ADD [FileName] VARCHAR(300) NULL 
GO 

CREATE VIEW dbo.vw_ResultsDump AS
SELECT
    PC,
    Amp,
    RCS,
    CW,
    State0,
    State1
FROM
    ResultsDump
GO

BULK INSERT vw_ResultsDump
    FROM 'c:\distance1000_7_13_2010_1_13PM_Avery DennisonAD_2300008_10S_Lock.csv' 
    WITH 
    ( 
        FIRSTROW = 2, 
        MAXERRORS = 0, 
        FIELDTERMINATOR = ',', 
        ROWTERMINATOR = '\n'
    )

UPDATE dbo.ResultsDump 
SET [FileName] = 'c:\distance1000_7_13_2010_1_13PM_Avery DennisonAD_2300008_10S_Lock.csv'
WHERE [FileName] IS NULL 

BULK INSERT vw_ResultsDump
    FROM 'c:\distance1000_7_13_2010_2_27PM_Avery DennisonAD_2300009_10S_Lock.csv' 
    WITH 
    ( 
        FIRSTROW = 2, 
        MAXERRORS = 0, 
        FIELDTERMINATOR = ',', 
        ROWTERMINATOR = '\n'
    )

UPDATE dbo.ResultsDump 
SET [FileName] = 'distance1000_7_13_2010_2_27PM_Avery DennisonAD_2300009_10S_Lock.csv'
WHERE [FileName] IS NULL 
4
ответ дан 8kb 22 August 2018 в 04:11
поделиться
  • 1
    Но в этом случае номера столбцов не согласуются, поэтому я не могу использовать BULK INSERT? – Albert Lyu 23 August 2010 в 04:35
  • 2
    @Think Blue Crew: не вставляет ли вставки лишние столбцы в конце таблицы? Если нет, вам нужно указать файл формата. Для примера см. stackoverflow.com/questions/3526136/… – Andomar 23 August 2010 в 04:41
  • 3
    @Think Blue Crew: вы можете использовать ответ Andomar, добавив столбец FileName в таблицу ResultsDump, создав столбец FileName без , объемную вставку в представление и затем обновив столбец FileName в оригинале Таблица. – 8kb 23 August 2010 в 05:48
  • 4
    Упс ... прокомментировал не то место. Ну что ж. +1 для подхода! – 8kb 23 August 2010 в 05:50
  • 5
    @Walker, я отредактировал ответ, чтобы точно показать, как он будет выглядеть. – 8kb 10 February 2016 в 22:11

Попробуйте это,

                    ALTER PROCEDURE [dbo].[ReadandUpdateFileNames_SP]
            (
             @spRequestId NVARCHAR(50)
            ,@LoopCounter INT =0
            ,@MaxFIVId INT=0
            ,@spFileName NVARCHAR(100)=NULL)
            AS
            BEGIN
            SET NOCOUNT ON
                BEGIN TRY
                    BEGIN TRAN
                    -- To read filename's from the Request Id and store it in a temp table
                        DECLARE @cmd nvarchar(500)
                        SET @cmd = 'dir D:\Input\REQUEST-'+@spRequestId+' /b '
                        --PRINT @cmd
                        DECLARE  @DirOutput TABLE(
                                      ID INT IDENTITY
                                    , files varchar(500))

                        INSERT INTO @DirOutput 
                        EXEC master.dbo.xp_cmdshell @cmd
                        SELECT * FROM @DirOutput WHERE files IS NOT NULL ORDER BY ID

                        ----Read files by RequestId BEGIN

                        SELECT @LoopCounter = min(ID) , @MaxFIVId = max(ID)
                            FROM @DirOutput 

                        WHILE(@LoopCounter IS NOT NULL AND @LoopCounter<@MaxFIVId)
                        BEGIN
                        -- Create temp table to store FIVItems 
                            CREATE  TABLE Items_TEMP  
                            (
                                  ControlID NVARCHAR(50)
                                , UNRS_Code NUMERIC(18,0)
                                , UNRS_Code_S NUMERIC(18,0)
                                , Ordered_Quantity NUMERIC(18,3)
                                , Sent_Quantity NUMERIC(18,3)
                                , Accepted_Quantity NUMERIC(18,3)
                                , Unit_Food_Price NUMERIC(18,2)
                                , Total_Price NUMERIC(18,2)
                            )
                        SELECT @spFileName=files FROM @DirOutput WHERE ID=@LoopCounter
                            PRINT @LoopCounter
                            DECLARE @spControlId NVARCHAR(50)
                            SET @spControlId='FFO'+ Substring(@spFileName, 4, (len(@spFileName)-7)) 
                            --PRINT @spControlId
                            DECLARE @sqlCmd NVARCHAR(MAX)
                            SET @sqlCmd='BULK INSERT 
                            Items_TEMP
                            FROM ''D:\Input\REQUEST-'+@spRequestId+'\'+@spFileName+'''
                            WITH(
                                  FIELDTERMINATOR='',''
                                , ROWTERMINATOR=''\n''
                            )'
                            PRINT @sqlCmd
                            EXECUTE sp_executesql @sqlCmd
                            ---Add a new column to the table which is not present in the CSV
                            ALTER TABLE Items_TEMP ADD OrderId NUMERIC(18,0)NULL
                            UPDATE Items_TEMP SET ControlID=@spControlId,OrderId=(SELECT OrderId FROM dbo.Orders WHERE ControlID=@spControlId)
                            SELECT * FROM Items_TEMP

                            --DROP FIVItems_TEMP table once CSV output generated
                            DROP TABLE Items_TEMP


                            SET @LoopCounter=@LoopCounter+1
                        END
                    ----****END***
                    COMMIT TRAN
                END TRY
                BEGIN CATCH
                    ROLLBACK TRAN
                    PRINT 'ROLLBACK'
                    PRINT Error_Message()
                    SELECT ERROR_LINE() AS ErrorLine;
                END CATCH
            SET NOCOUNT OFF
            END
0
ответ дан Thamizhmani 22 August 2018 в 04:11
поделиться
  • 1
    Пожалуйста, прочтите это как ответить и уточните свой ответ в случае необходимости. Не может быть хорошим ответом. – thewaywewere 7 May 2017 в 12:40
Другие вопросы по тегам:

Похожие вопросы: