#sql-server #database
#sql-сервер #База данных
Вопрос:
Ниже я показываю, что я пробовал до сих пор.
У меня есть while
цикл SQL Server с использованием курсора. Проблема в моем запросе находится в строке с приведенным ниже кодом:
SELECT NAME
FROM TRDR
WHERE TRDR = MyCursor.TRDR
Я не уверен, как извлечь значение из курсора @MyCursor
DECLARE @MyCursor CURSOR;
DECLARE @MyField INT;
DECLARE @FromDate DATE;
DECLARE @ToDate DATE;
DECLARE @Serie INT;
DECLARE @Sosource INT;
DECLARE @trdr INT;
SET @FromDate = '20160901';
SET @ToDate = '20160930';
SET @Serie = 4700;
SET @Sosource = 1416;
SET @trdr = 2835;
BEGIN
SET @MyCursor = CURSOR FOR
SELECT TOP 1000 FINDOC, TRDR
FROM FINDOC
WHERE SOSOURCE = @Sosource
AND TRNDATE >= @FromDate
AND TRNDATE <= @ToDate
AND SERIES = @Serie
AND TRDR = 2835
END
OPEN @MyCursor
FETCH NEXT FROM @MyCursor INTO @MyField
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT NAME
FROM TRDR
WHERE TRDR = MyCursor.TRDR
FOR XML PATH('GrpHdr'), ROOT ('CstmrCdtTrfInitn')
FETCH NEXT FROM @MyCursor INTO @MyField
END;
CLOSE @MyCursor ;
DEALLOCATE @MyCursor;
Ожидаемый результат должен быть таким, как показано ниже:
<CstmrCdtTrfInitn>
<GrpHdr>
<name>Chris</name>
</GrpHdr>
<GrpHdr>
<name>Martin</name>
</GrpHdr>
<GrpHdr>
<name>John</name>
</GrpHdr>
<GrpHdr>
<name>George</name>
</GrpHdr>
<GrpHdr>
<name>Michael</name>
</GrpHdr>
</CstmrCdtTrfInitn>
Ответ №1:
Обновите до того, что вы действительно хотите для результатов. Попробуйте это и посмотрите, работает ли это.
Select TOP 1000 T.Name
FROM FINDOC F
JOIN TRDR T ON F.TRDR = T.TRDR
WHERE F.SOSOURCE = @Sosource
AND F.TRNDATE >= @FromDate
AND F.TRNDATE <= @ToDate
AND F.SERIES = @Serie
AND F.TRDR = 2835
FOR XML PATH('GrpHdr'), ROOT ('CstmrCdtTrfInitn')
Комментарии:
1. Спасибо за ваш ответ. Это устраняет мою проблему, но создает много XML-файлов. Возможно ли создать только один XML-файл?
2. Можете ли вы показать свои данные, как входные, так и ожидаемые результаты?
3. Я добавил ожидаемый результат в свой вопрос
4. Обновите ответ на основе того, что вы хотите. Я не думаю, что для этого вам нужен курсор.