我想根据条件制作返回两个字符的函数。
假设我有一张表 tbl_Dummy
CREATE TABLE [dbo].[tbl_Dummy](
[Id] [varchar](2) NOT NULL,
[Name] [varchar](30) NOT NULL
)
如果tbl_dummy中Id的最大值为01,则返回02,依此类推,当它传递给09时,则返回0A直到0Z,之后它将返回10,依此类推。
我已经这样做了,但这不适用于我的场景
create FUNCTION dbo.GenerateValue ()
RETURNS VARCHAR(250)
AS BEGIN
DECLARE @counter int = 1;
DECLARE @Work VARCHAR(2)
DECLARE @temp VARCHAR(2)
DECLARE @tempW VARCHAR(2)
declare @value int
select @Work = MAX(id) from tbl_Dummy
WHILE @counter <= DATALENGTH(@Work)
BEGIN
SELECT @temp = ASCII(SUBSTRING(@Work, @counter, 1))
SET @counter = @counter + 1
if @temp >= '48' and @temp <= '56' or @temp >= '65' and @temp <= '89'
begin
select @value = CONVERT(INT, @temp)
set @value = @temp + 1
end
else if @temp = '57'
set @value = 'A'
else if @temp = '90'
set @tempW = '0'
set @tempW += CHAR(ASCII(SUBSTRING(@Work, @counter, 1)))
END
RETURN @work
END
答案 0 :(得分:2)
您不应每次都获得MAX(Id)
,而应在表格中添加IDENTITY
列和计算列以计算正确的ID。
CREATE TABLE tbl_Dummy(
TempId INT IDENTITY(1, 1),
Id AS ISNULL(dbo.GenerateValue(TempId),'') PERSISTED,
Name VARCHAR(30) NOT NULL
)
这样,在tbl_Dummy
中插入一行后,您不必总是计算最新的Id
。 TempId
将为您提供。至于如何计算所需的Id
,这里有一种没有循环的方法:
CREATE FUNCTION dbo.GenerateValue (@N INT)
RETURNS CHAR(2) WITH SCHEMABINDING AS
BEGIN
RETURN
(
SELECT returnStr =
SUBSTRING(Str1, (@N/36) % LEN(Str1) + 1, 1) + --LeftMost
SUBSTRING(Str1, (@N/1) % LEN(Str1) + 1, 1) --RightMost
FROM (
SELECT '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
) d(Str1)
);
样本用法:
INSERT INTO dbo.tbl_Dummy(Name)
SELECT TOP 20
SomethingElse = 'Random' + CONVERT(VARCHAR(10), ROW_NUMBER() OVER(ORDER BY (SELECT NULL)))
FROM sys.all_columns ac1
SELECT * FROM dbo.tbl_DUmmy
结果:
TempId Id Name
----------- ---- ------------------------------
1 01 Random1
2 02 Random2
3 03 Random3
4 04 Random4
5 05 Random5
6 06 Random6
7 07 Random7
8 08 Random8
9 09 Random9
10 0A Random10
11 0B Random11
12 0C Random12
13 0D Random13
14 0E Random14
15 0F Random15
16 0G Random16
17 0H Random17
18 0I Random18
19 0J Random19
20 0K Random20
参考: