2009-05-27 2 views
0

У меня есть таблица, в которой хранятся данные пользователя. В таблице есть столбец идентификатора пользователя (идентификатор). Данные таблицы запрашиваются представлением, на которое ссылается множество sprocs, но мы ссылаемся на то, что называется auid, которое создается UDF ниже. UDF вызывается в представлении и sprocs, затем соединяется или запрашивает из представления на основе auid. Похоже, эта процедура называется LOT (тысячи раз) и вызывает некоторую ненужную нагрузку на наш SQL Server. Есть ли лучший способ взять user_id = 255 и превратить его в varchar = 000000255 (длиной 9 символов)?SQL string manipulation

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))[email protected]_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 

Пример вызова в sproc выглядит следующим образом:

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 

Заранее спасибо!

ответ

2

Вы можете использовать две функции, которые помогут вам: RIGHT и REPLICATE

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 
2

По какой-либо причине вы не можете просто сохранить идентификатор пользователя таким образом, чтобы начать?

+0

Согласна, если AUID не может измениться, нет никаких причин, чтобы пересчитывать его с каждым запросом. –

+0

-1: Это должен быть комментарий, а не ответ. – Eric

+0

Хм, казалось, между мной. Я все еще учусь. – Gandalf

0
RIGHT('000000000' + CAST(@user_id as varchar(9)), 9) 

Таким образом, вы не выполняете несколько приведений, и у вас нет LEN, о которых нужно беспокоиться.