我创建了用户定义的函数,它将逗号分隔的字符串转换为表格。我执行此功能,像这样:SQL - 遍历表记录
select [String] as 'ID' from dbo.ConvertStringToTable('1,2,3,4')
从该查询结果如下所示:
ID
--
1
2
3
4
在现实中,我想通过每一个在这个表中的行进行迭代。但是,我无法弄清楚如何做到这一点。有人能告诉我一些关于如何遍历表的行的示例SQL吗?
我创建了用户定义的函数,它将逗号分隔的字符串转换为表格。我执行此功能,像这样:SQL - 遍历表记录
select [String] as 'ID' from dbo.ConvertStringToTable('1,2,3,4')
从该查询结果如下所示:
ID
--
1
2
3
4
在现实中,我想通过每一个在这个表中的行进行迭代。但是,我无法弄清楚如何做到这一点。有人能告诉我一些关于如何遍历表的行的示例SQL吗?
文档中的SQL SERVER 2000年5月8日,你可以使用游标,如下图所示。
但是,在你走下光标路径之前,你应该先看看与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
答案是游标,但如果有机会不使用游标,我会建议使用其他解决方案。
您的查询看起来像一个SQL Server查询,所以这里是SQL Server 2008
如果可以避免使用游标,通常所有您真正需要的就是加入到您创建的表中。如果您的光标正在进行更新,插入或删除,则有99.9%的机会不需要光标。游标应该是最后的度假胜地,而不是一种手段。遍历记录在数据库中几乎总是一个糟糕的选择。学会思考。
为什么要避免游标?因为他们创造了性能噩梦。我通过删除curosr将流程从24小时或更长时间更改为不到一分钟。
使用下面的函数,该函数字符串和定界符....
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
你使用的是Oracle,SQL服务器,MySQL和...?迭代时你想做什么? – Andomar 2010-02-05 12:33:10
你能描述一下你试图解决的问题吗?可以肯定的是,你不需要迭代来解决你的问题。 – 2010-02-05 12:37:46
我正在使用SQL Server。我想遍历表格。 – user255048 2010-02-05 12:46:50