Превратить оператор SQL в хранимую процедуру? - PullRequest
2 голосов
/ 02 апреля 2012

У меня очень большой скрипт, который создает несколько представлений. В ряде представлений используется один и тот же фрагмент сценария. Этот скрипт указан ниже.

CASE WHEN pc.[user_name] IN
(
    SELECT [user_name]
    FROM people AS p WITH(NOLOCK) 
    WHERE p.status_id = 1 p.last_login > DATEADD(MONTH, -12, GETDATE())
    AND p.[user_name] NOT IN 
    (
        SELECT p.[user_name]
        FROM people AS p WITH(NOLOCK)
        WHERE p.status_id IN (1,2) AND p.[user_name] LIKE '%2'
    )
) THEN pc.[user_name]
ELSE 'standarduser' END AS created_by

Может ли кто-нибудь указать мне правильное направление, как написать функцию, в которой я могу передать pc.[user_name], и она вернет правильное значение? Я новичок в функции в SQL. Спасибо.

Ответы [ 3 ]

2 голосов
/ 02 апреля 2012

Функция может быть создана следующим образом:

CREATE FUNCTION [dbo].[FunctionName] (@UserName VARCHAR(50)) 
RETURNS VARCHAR(50) 
AS
BEGIN   
    RETURN  COALESCE(
                (   SELECT  [User_name]
                    FROM    people AS p WITH(NOLOCK)      
                    WHERE   p.status_id = 1 
                    AND     p.last_login > DATEADD(MONTH, -12, GETDATE())     
                    AND     p.[user_name] NOT LIKE '%2'
                    AND     [User_name] = @UserName
                ), 'StandardUser')
END

Я попытался максимально упростить ваш выбор, исходя из предположения, что имя_пользователя уникально, т. Е. Имя_пользователя не может иметь статус-идентификатора 1 и 2, что позволило мне удалить NOT IN из оператора, так как сначала вы выбираете группу пользователей, где status_ID равен 1, а затем удаляете из них, где status_ID равен 1 или 2, а имя пользователя заканчивается на 2. Поскольку в первой группе не будет никого, у кого статус status_ID не равен 1 затем вы можете просто удалить тех из первой группы, чье имя пользователя заканчивается на 2, для которого не требуется подзапрос, только предложение where.

Сказав все это, я все равно был бы склонен использовать представление или аналогичное решение на основе множеств для достижения того же результата. Что-то вроде:

SELECT  *, COALESCE(a.[User_Name], 'StandardUser') [NewUserName]
FROM    People p
        LEFT JOIN 
        (   SELECT  [User_name]
            FROM    people AS p WITH(NOLOCK)      
            WHERE   p.status_id = 1 
            AND     p.last_login > DATEADD(MONTH, -12, GETDATE())     
            AND     p.[user_name] NOT LIKE '%2'
        ) a
            ON p.[User_name] = a.[User_name]
0 голосов
/ 02 апреля 2012

Вы можете сделать это представление или табличную функцию (если вам нужна другая логика или вы хотите передать параметр) и включить ее в другие представления / процессы, объединенные как таблица

;
with users as (
select p.user_name
  , p.status_id
  , p.last_login
from people as p with(nolock)
where p.status_id IN (1,2)
)
select DISTINCT u.user_name
  , CASE WHEN u.[user_name] IN 
     ( 
       SELECT [user_name] 
       FROM users AS u1 
       WHERE u1.status_id = 1 u1.last_login > DATEADD(MONTH, -12, GETDATE()) 
       AND u1.[user_name] NOT IN  
          ( 
             SELECT u2.[user_name] 
             FROM users AS u2  
             WHERE u2.status_id IN (1,2) AND u2.[user_name] LIKE '%2' 
          ) 
    ) THEN u.[user_name] 
      ELSE 'standarduser' END AS created_by 
from users as u
0 голосов
/ 02 апреля 2012

Вы можете попробовать скалярную функцию, как эта

CREATE function [dbo].[MyFunction] (
@UserName nvarchar
) 
returns nvarchar
as
begin
CASE WHEN pc.[user_name] IN 
(     
    SELECT [user_name]     
    FROM people AS p WITH(NOLOCK)      
    WHERE p.status_id = 1 p.last_login > DATEADD(MONTH, -12, GETDATE())     

    AND p.[user_name] NOT IN 
    (         
        SELECT p.[user_name]         
        FROM people AS p WITH(NOLOCK)         
        WHERE p.status_id IN (1,2) AND p.[user_name] LIKE '%2'     
    )
)
THEN pc.[user_name] ELSE 'standarduser' END AS created_by 

end

GO

Edit: О, если вы используете SQL Server, который

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...