Манипулирование строкой SQL - PullRequest
0 голосов
/ 28 мая 2009

У меня есть таблица, в которой хранится информация о пользователях. В таблице есть столбец идентификатора пользователя (идентификатор). Данные таблицы запрашиваются представлением, на которое ссылается множество sprocs, но мы ссылаемся на нечто, называемое auid, которое создается UDF ниже. UDF вызывается в представлении, и затем sprocs присоединяются или запрашивают из представления на основе auid. Похоже, что эта процедура называется LOT (тысячи раз) и вызывает некоторую ненужную нагрузку на наш 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 

Пример вызова в 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

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

Ответы [ 3 ]

2 голосов
/ 28 мая 2009

Вы можете использовать две функции, которые вам помогут: ВПРАВО и 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 голосов
/ 28 мая 2009

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

0 голосов
/ 28 мая 2009
RIGHT('000000000' + CAST(@user_id as varchar(9)), 9)

Таким образом, вы не выполняете несколько кастов, и вам не о чем беспокоиться.

...