目前我使用的是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
,因为文件名为