根据while循环的当前迭代获取值



目前我使用的是SQL Server Management Studio v18,我想使用while循环迭代Table Type,所以我这样做了:

CREATE TYPE [VarcharIdTableType] AS TABLE
(
[FileName] VARCHAR(MAX)
)

然后我使用while循环作为:

DECLARE @FileTableType [VarcharIdTableType]
INSERT INTO @FileTableType 
VALUES ('test1'),('test2'),('test3')
DECLARE @FileCount INT = (SELECT COUNT(*) FROM @FileTableType), @RowCount INT = 0
WHILE @RowCount <= @FileCount
BEGIN                  
DECLARE @Content VARCHAR(555)= CONCAT('File name ', @filename)
SET @RowCount = @RowCount + 1;
END

所以我想根据迭代次数获得每个FileName,我该如何实现?

重要提示:您真的需要循环吗?由于您尚未向我们展示您想要的最终结果,我们无法对此发表评论。但在许多情况下,基于集合的方法可以满足您的需求,如果需要,则应该使用它。

做一些假设,比如表中没有ID列,并且能够从表变量中删除行,我会使用exists而不是计数行来执行以下操作。

DECLARE @FileTableType TABLE ([Name] VARCHAR(MAX));
INSERT INTO @FileTableType([Name]) VALUES ('test1'), ('test2'), ('test3');
DECLARE @Content VARCHAR(MAX) = '', @Filename VARCHAR(MAX);
WHILE EXISTS (SELECT 1 FROM @FileTableType)
BEGIN
SELECT TOP 1 @Filename = [Name] FROM @FileTableType;
SET @Content = CONCAT('File number ', @Filename);
DELETE FROM @FileTableType WHERE [Name] = @Filename;
END;

但是,在表变量的值上有一个已知的唯一标识符会更好,因为如果有重复的文件名,第一个代码就会出现问题。

DECLARE @FileTableType TABLE (id INT IDENTITY(1,1), [Name] VARCHAR(MAX));
INSERT INTO @FileTableType([Name]) VALUES ('test1'), ('test2'), ('test3');
DECLARE @Content VARCHAR(MAX) = '', @Filename VARCHAR(555), @FileId INT;
WHILE EXISTS (SELECT 1 FROM @FileTableType)
BEGIN
SELECT TOP 1 @FileId = id, @Filename = [Name] FROM @FileTableType;
SET @Content = CONCAT('File number ', @Filename);
DELETE FROM @FileTableType WHERE id = @FileId;
END;

注意最佳实践:

  • 用分号终止所有语句
  • 插入时列出所有列
  • VARCHAR(MAX)用于@Content,因为文件名为

最新更新