получить данные со связанного сервера, используя цикл - PullRequest
0 голосов
/ 23 октября 2019

В моей БД есть таблица TodayID, таблица содержит более 400000 строк, я ищу способ / пример для загрузки данных в БД MSSQL со связанного сервера с использованием цикла While, With для каждого идентификатора. Я использовал IN, но получил ошибку «openquery больше чем 8000 символов», используя EXEC AT, настройка RPC, RPC out не решила проблему.

DECLARE @SQL VARCHAR(MAX)
DECLARE @ID  VARCHAR(MAX)
DECLARE @resTable TABLE(ID VARCHAR(50), NAME VARCHAR(100), DTIME DATETIME, FIELD VARCHAR(100))
SET @ID = (STUFF((SELECT ',' + '''''' + [ID] + '''''' FROM [TodayID] FOR XML PATH('')) ,1,1,'') )  
Print @ID
SET @SQL='SELECT * FROM OPENQUERY(RemoteServer, ''SELECT ID, NAME, DTIME, FIELD FROM AUDIT WHERE ID IN (' + @ID + ')  '')'
Print @SQL
INSERT INTO @resTable EXEC (@SQL)
select * from @resTable

1 Ответ

0 голосов
/ 23 октября 2019

Следующий запрос поможет вам, если вы хотите прочитать строки таблицы через цикл WHILE . Однако значения столбцов идентификаторов должны быть упорядочены.

DECLARE @SQL VARCHAR(MAX)
DECLARE @ID  VARCHAR(MAX)
DECLARE @Counter AS INT
DECLARE @MaxCounter AS INT

DECLARE @resTable TABLE(ID VARCHAR(50), NAME VARCHAR(100), DTIME DATETIME, FIELD VARCHAR(100))
--SET @ID = (STUFF((SELECT ',' + '''''' + [ID] + '''''' FROM [TodayID] FOR XML PATH('')) ,1,1,'') )  

SELECT @Counter = MIN(ID) FROM [TodayID]
SELECT @MaxCounter=MAX(ID) FROM [TodayID]

WHILE(@Counter IS NOT NULL
      AND @Counter <= @MaxCounter)

      BEGIN
SET @SQL='SELECT * FROM OPENQUERY(RemoteServer, ''SELECT ID, NAME, DTIME, FIELD FROM AUDIT WHERE ID IN (' + CONVERT(VARCHAR,@Counter) + ')  '
Print @SQL
INSERT INTO @resTable EXEC (@SQL)
SET @Counter  = @Counter  + 1        --According to your id gap
END
select * from @resTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...