SQL - Итерирование через записи таблицы
Я создал пользовательскую функцию, которая преобразует строку с разделителями-запятыми в таблицу. Я выполняю эту функцию следующим образом:
select [String] as 'ID' from dbo.ConvertStringToTable('1,2,3,4')
Результаты этого запроса выглядят следующим образом:
ID
--
1
2
3
4
В действительности, я хочу перебирать каждую из строк в этой таблице. Однако я не могу понять, как это сделать. Может ли кто-нибудь показать мне пример SQL о том, как перебирать строки таблицы?
Ответы
Ответ 1
В SQL SERVER 2000/05/08 вы можете использовать курсор, как показано ниже.
Однако перед тем, как вы спуститесь по пути курсора, вы должны сначала изучить проблемы, связанные с курсорами в SQL Server.
DECLARE @id VARCHAR(10)
DECLARE myCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT [String] AS 'ID'
FROM [dbo].[ConvertStringToTable]('1,2,3,4')
OPEN myCursor
FETCH NEXT FROM myCursor INTO @id
WHILE @@FETCH_STATUS = 0 BEGIN
PRINT @id
-- do your tasks here
FETCH NEXT FROM myCursor INTO @id
END
CLOSE myCursor
DEALLOCATE myCursor
Ответ 2
Не используйте курсор, если вы можете его избежать, обычно вам действительно нужно присоединиться к созданной вами таблице. Если ваш курсор выполняет обновление, вставку или удаление, у вас есть 99,9% вероятность того, что вам не понадобится курсор. Курсоры должны быть техникой курорта LAST, не первого курорта. Итерация по записям почти всегда является плохим выбором в базе данных. Научитесь думать в наборах.
Почему вы должны избегать курсоров? Старайтесь создавать кошмары производительности. Я изменил процессы от 24 часов и более до менее чем одной минуты, удалив curosr.
Ответ 3
Используйте следующую функцию, которая берет строку и символ разделителя....
CREATE FUNCTION [dbo].[Udfsplitstring](@Text VARCHAR(MAX),
@Delimiter VARCHAR(20) = ' ')
-- @Strings table will contain values after separated by delimiter
RETURNS @Strings TABLE (
ID INT IDENTITY PRIMARY KEY,
VALUE VARCHAR(MAX))
AS
BEGIN
DECLARE @Index INT
-- Set the index to -1 prior to run index through the loop
SET @Index = -1
-- Run loop till Text becomes empty
WHILE ( Len(@Text) > 0 )
BEGIN
-- Getting the index of first delimiter
SET @Index = Charindex(@Delimiter, @Text)
-- Checking if there is no delimiter in Text
IF ( @Index = 0 )
AND ( Len(@Text) > 0 )
BEGIN
-- Inserting text which separated by delimiter
INSERT INTO @Strings
VALUES (Rtrim(Ltrim(@Text)))
BREAK
END
-- Checking if index found in Text then run the following script
IF ( @Index > 1 )
BEGIN
-- Inserting text after separated by delimiter
INSERT INTO @Strings
VALUES (LEFT(@Text, @Index - 1))
-- Separate the inserted value from text
SET @Text = Rtrim(Ltrim(RIGHT(@Text, ( Len(@Text) - @Index )))
)
END
ELSE
-- Separate the inserted value from text
SET @Text = Rtrim(Ltrim(RIGHT(@Text, ( Len(@Text) - @Index ))))
END
RETURN
END
Ответ 4
Ответ будет курсорами, но если есть возможность не использовать курсор, я бы предложил использовать другое решение.
Ваш запрос похож на SQL Server Query, поэтому здесь представлена документация для SQL Server 2008.
http://msdn.microsoft.com/en-us/library/ms190028.aspx