我创建了用户定义的函数,将逗号分隔的字符串转换为表格。我像这样执行这个函数:
select [String] as 'ID' from dbo.ConvertStringToTable('1,2,3,4')
此查询的结果如下所示:
ID
--
1
2
3
4
实际上,我想遍历此表中的每一行。但是,我无法弄清楚如何做到这一点。有人可以向我展示一些如何迭代表格行的示例SQL吗?
答案 0 :(得分:13)
在SQL SERVER 2000/05/08中,您可以使用Cursor,如下所示。
但是,在关注光标路径之前,首先应该查看与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
答案 1 :(得分:5)
如果可以避免使用光标,请不要使用光标,通常您真正需要的是加入您创建的表。如果光标正在进行更新,插入或删除,则有99.9%的可能性不需要光标。游标应该是最先进度假的技术。在数据库中迭代记录几乎总是一个糟糕的选择。学习成套思考。
为什么要避免使用游标?他们创造了表演噩梦。通过移除curosr,我已经将过程从24小时或更长时间改为不到一分钟。
答案 2 :(得分:1)
使用下面的函数,它接受字符串和分隔符....
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
答案 3 :(得分:0)
答案是游标,但如果有机会不使用游标,我建议使用其他解决方案。
您的查询看起来像SQL Server查询,因此这里是SQL Server 2008的文档。