Есть ли способ «сжать» этот SQL-запрос дальше? - PullRequest
0 голосов
/ 24 февраля 2011

Я написал SQL-запрос, который обеспечивает уникальность имени файла в таблице.Если передаваемый параметр равен NULL, то перед проверкой ему присваивается случайное значение.

Вот мой код:

SET @FileName=REPLACE(ISNULL(@FileName, dbo.fn_String_GenerateRandom(NEWID(), 10)), ' ', '-')
DECLARE @i int,@FileNameCheck nvarchar(200); SELECT @i=2, @FileNameCheck=@FileName
WHILE (SELECT COUNT(*) FROM [eJournals] WHERE [FileName]=@FileNameCheck) > 0
BEGIN
    SELECT @FileNameCheck = @FileName + '-' + CAST(@i as nvarchar(3)), @i=@i+1
END
SET @FileName = @FileNameCheck

Есть ли способ сжать это на меньшее количество строк?

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

э-э ... да.

Вы также можете потерять BEGIN END для одного оператора WHILE. И добавьте точку с запятой или 2: но это только для ясности в этом случае.

SET @FileName=REPLACE(ISNULL(@FileName, dbo.fn_String_GenerateRandom(NEWID(), 10)), ' ', '-'); DECLARE @i int,@FileNameCheck nvarchar(200); SELECT @i=2, @FileNameCheck=@FileName; WHILE (SELECT COUNT(*) FROM [eJournals] WHERE [FileName]=@FileNameCheck) > 0 SELECT @FileNameCheck = @FileName + '-' + CAST(@i as nvarchar(3)), @i=@i+1; SET @FileName = @FileNameCheck
0 голосов
/ 24 февраля 2011

Вот альтернативный способ решения вышеуказанной проблемы:

drop table Filenames
create table Filenames (fname varchar(200) not null)
insert into Filenames values ('hello.txt')
insert into Filenames values ('hello.txt0')
insert into Filenames values ('hello.txt1')
declare @fileName varchar(200) = 'hello.txt'

declare @realFileName varchar(200) = 
    (select top 1 f.fname from
         (select 0 as rownum, @filename as fname union
          select 
              row_number() over (order by fname) as rownum, 
              @filename + cast(row_number() over (order by fname) as varchar) as fname
          from Filenames) as f
     where f.fname not in (select fname from Filenames)
     order by f.rownum)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...