0

ユーザー情報を格納するテーブルがあります。テーブルには userid (identity) 列があります。テーブル データは、多くの sproc によって参照されるビューによってクエリされますが、以下の UDF によって作成される auid と呼ばれるものを参照します。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 

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

前もって感謝します!

4

3 に答える 3

2

そもそもユーザーIDをそのように保存できない理由はありますか?

于 2009-05-27T22:33:07.777 に答える
2

あなたを助ける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 に答える