курсор не добавляет данные, добавляет только при выполнении отдельно - PullRequest
0 голосов
/ 15 октября 2018

У меня есть хранимая процедура и цикл курсора, который я использую для добавления данных в основной таблице: я добавляю данные из CSV-файла во временную таблицу и из временной таблицы в основную таблицу

alter PROCEDURE [dbo].[CreateHub]
  @HubName varchar(100)
AS

INSERT INTO dbo.HUB1
                         (HUB_NAME)
SELECT        @HubName
WHERE        (NOT EXISTS
                             (SELECT        ID_HUB, HUB_NAME
                               FROM            dbo.HUB1
                               WHERE        (HUB1.hub_name = @HubName)))

SELECT        ID_HUB AS newHubId
FROM            dbo.HUB1
WHERE        (hub1.hub_name = @HubName)

GO

После этогоготово, есть другой код, который выполняет массовую вставку из CSV-файла и запускает цикл курсора для добавления данных в основную таблицу

bulk insert [dbo].[HUB_temp]
from 'C:\POPAD-DAT\HUB1.csv'
with (fieldterminator = ',', rowterminator = '\n')
go

DECLARE @sSQL AS nVARCHAR(100)
DECLARE @ItemsFromCSV  AS nvarchar(200)

DECLARE sql_cursor_hub CURSOR
    FOR SELECT HUB_NAME FROM HUB_temp
OPEN sql_cursor_hub

FETCH NEXT FROM sql_cursor_hub 
INTO @ItemsFromCSV  -- Multiple variables for multiple CSV columns will be required

WHILE @@FETCH_STATUS = 0
BEGIN

set @sSQL = 'EXEC  [dbo].[CreateHub] ' + @ItemsFromCSV  -- AND OTHER Parameters
print @sSQl
EXECUTE sp_executesql @sSQL

FETCH NEXT FROM sql_cursor_hub
END 

CLOSE sql_cursor_hub;

DEALLOCATE sql_cursor_hub;

Запуск курсора не добавляет данные, которые отображаются как один и тот же идентификатор, и показывают разные u =hubname, но без вставки данных

Хотя, если я работаю отдельно, выполняю SP, он добавляет вот так

EXEC  [dbo].[CreateHub] 'SGGSP30'
EXEC  [dbo].[CreateHub] 'USGSP20'

Не могли бы вы помочь, где именно я ошибаюсь

1 Ответ

0 голосов
/ 15 октября 2018

Вы забыли выполнить INTO во второй выборке

WHILE @@FETCH_STATUS = 0
BEGIN

  set @sSQL = 'EXEC  [dbo].[CreateHub] ' + @ItemsFromCSV  -- AND OTHER Parameters
  print @sSQl
  EXECUTE sp_executesql @sSQL

  -- This is changed
  FETCH NEXT FROM sql_cursor_hub INTO @ItemsFromCSV
END 

Вам также следует позаботиться о объявлениях параметров, @ItemsFromCSV - это varchar (200), но сохраненный параметр proc - только varchar (100)и @sSQL имеет размер только 100, но вы добавляете @ItemsFromCSV к нему.

...