0

我有一个存储用户信息的表。该表中有一个用户 ID(身份)列。表数据由一个视图查询,该视图被许多存储过程引用,但我们引用了一个名为 auid 的东西,它由下面的 UDF 创建。UDF 在视图中被调用,sprocs 然后根据 auid 从视图中加入或查询。看起来这个例程被调用了很多次(数千次)并且在我们的 SQL Server 上造成了一些不必要的负载。有没有更好的方法来获取 user_id = 255 并将其转换为 varchar = 000000255 (9 个字符长)?

UDF 语法:

ALTER FUNCTION [dbo].[udf_AUID] (@user_id int)  
RETURNS char(9) 
with schemabinding
AS  
BEGIN 
DECLARE @user_id_string varchar(9)
DECLARE @rval char(9)

SELECT @user_id_string=CAST(@user_id as varchar(9))
SELECT @rval=LEFT('000000000',9-len(@user_id_string))+@user_id_string

RETURN @rval
END

视图的基本语法是:

ALTER VIEW [dbo].[v_users]
AS
SELECT     
dbo.udf_AUID(dbo.users.user_id) AS auid, 
user_id, 
dbo.users.username 
FROM dbo.users 

存储过程中的示例调用如下所示:

DECLARE @auid CHAR(9)
SET @auid = '000002444'  --normally passed in, but set here for example
SELECT dealer_range FROM users WHERE auid = @auid

DECLARE @cat_access TINYINT, @mit_access TINYINT
SELECT @cat_access = chan_access & 1, @mit_access = chan_access & 2 
    FROM appian.dbo.v_users
WHERE auid = @auid

提前致谢!

4

3 回答 3

2

你有什么理由不能一开始就以这种方式存储用户标识?

于 2009-05-27T22:33:07.777 回答
2

您可以使用两个功能来帮助您:RIGHTREPLICATE

SELECT RIGHT(REPLICATE('0', 9) + '123456789', 9)    -- Result: 123456789
SELECT RIGHT(REPLICATE('0', 9) + '255', 9)          -- Result: 000000255
SELECT RIGHT(REPLICATE('0', 9) + '12', 9)           -- Result: 000000012
SELECT RIGHT(REPLICATE('0', 9) + '1', 9)            -- Result: 000000001
于 2009-05-27T22:39:20.387 回答
0
RIGHT('000000000' + CAST(@user_id as varchar(9)), 9)

这样,您就不会进行多次演员表,也不必担心 LEN。

于 2009-05-27T22:38:09.610 回答