2011-02-24 80 views
0

我写了一个SQL查询,确保文件名在表中是唯一的。如果传递的参数是NULL,那么在检查之前这被分配一个随机值。反正有没有进一步“压缩”这个SQL查询?

这里是我的代码:

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

反正是有这个压缩到更小的行?

+0

它,但具有到位不使这个SQL查询自动发生的(?我不认为),它会抛出一个我相信的约束错误? – Curt 2011-02-24 11:23:51

+0

你为什么需要这样做? – 2011-02-24 11:41:59

回答

1

呃...是的。

对于WHILE的单个语句,您也可能会失去BEGIN END。 并添加一个分号或2:但这些只是为了清晰起见,在这种情况下。

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

太棒了!感谢@gbn这将使我对这段代码的多次使用看起来不那么凌乱,并教会了我关于在一行上循环的一点:D – Curt 2011-02-24 11:26:59

+0

@Curt如果你在多个地方使用它,你不应该真的使用用户定义功能呢?或者每个副本的代码都会有轻微的变化 – Seph 2012-06-05 13:20:00

+0

@Seph是的,它会改变,如果你看脚本,它会提到列名和表名。这随每次使用脚本而改变。 – Curt 2012-06-06 08:45:49

0

这里是解决上述问题的另一种方式:

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)